Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
一段時間有網友問Excel轉pdf怎么轉pdf,小編幫他實現了一個,方法是使用EPPlus和PdfSharp組件實現,由于依賴OfficeOpenXml他也沒有用上,后來小編又實現了二種不依賴OfficeOpenXml的方法。本文將介紹這三種方法實現Excel轉pdf。
一、EPPlus和PdfSharp組件實現
邏輯是先將Excel內容轉換為HTML字符串,然后再將HTML字符串轉換為PDF文件。轉換過程中的格式和樣式可能會有一些差異,您可能需要根據需求進行進一步的調整和優化。
使用方法
1、首先使用“NuGet 包管理器”安裝EPPlus和PdfSharp
2、在代碼頁面引用
using IronPdf;
using OfficeOpenXml;
3、建兩個方法ConvertExcelToPdf和ExcelToHtml
ConvertExcelToPdf方法用于將Excel文件轉換為PDF文件,ExcelToHtml這個方法將Excel工作表的內容轉換為HTML字符串。代碼如下:
public static void ConvertExcelToPdf(string excelFilePath, string pdfFilePath)
{
// 讀取Excel文件
using (ExcelPackage package=new ExcelPackage(new FileInfo(excelFilePath)))
{
ExcelPackage.LicenseContext=LicenseContext.NonCommercial;
ExcelWorksheet worksheet=package.Workbook.Worksheets[0]; // 假設要轉換的工作表是第一個工作表
// 創建一個HTML字符串,將Excel內容轉換為HTML
string htmlContent=ExcelToHtml(worksheet);
// 使用IronPDF將HTML字符串轉換為PDF
var renderer=new HtmlToPdf();
renderer.PrintOptions.MarginTop=0;
renderer.PrintOptions.MarginBottom=0;
renderer.PrintOptions.MarginLeft=0;
renderer.PrintOptions.MarginRight=0;
var pdf=renderer.RenderHtmlAsPdf(htmlContent);
// 保存PDF文件
pdf.SaveAs(pdfFilePath);
}
}
public static string ExcelToHtml(ExcelWorksheet worksheet)
{
var sb=new StringBuilder();
sb.AppendLine("<table>");
var startRow=worksheet.Dimension.Start.Row;
var endRow=worksheet.Dimension.End.Row;
var startColumn=worksheet.Dimension.Start.Column;
var endColumn=worksheet.Dimension.End.Column;
for (int row=startRow; row <=endRow; row++)
{
sb.AppendLine("<tr>");
for (int col=startColumn; col <=endColumn; col++)
{
var cellValue=worksheet.Cells[row, col].Value;
sb.AppendLine("<td>" + (cellValue !=null ? cellValue.ToString() : "") + "</td>");
}
sb.AppendLine("</tr>");
}
sb.AppendLine("</table>");
return sb.ToString();
}
//調用方法
string excelFilePath="C:\\Users\\user\\Desktop\\test.xlsx";
string pdfFilePath="C:\\Users\\user\\Desktop\\test.pdf";
exceltopdf.ConvertExcelToPdf(excelFilePath, pdfFilePath);
主要有兩個方法:
ConvertExcelToPdf: 這個方法用于將Excel文件轉換為PDF文件。它首先使用ExcelPackage類從Excel文件中讀取數據。然后,調用ExcelToHtml方法將Excel內容轉換為HTML字符串。接下來,使用IronPDF庫中的HtmlToPdf類將HTML字符串轉換為PDF對象。最后,將PDF對象保存到指定的PDF文件路徑中。
ExcelToHtml: 這個方法將Excel工作表的內容轉換為HTML字符串。它使用StringBuilder來構建HTML字符串。首先,它添加
標簽作為表格的開始。然后,通過遍歷工作表的行和列,將每個單元格的值添加到HTML字符串中作為一個td元素。最后,添加table標簽作為表格的結束,并將構建好的HTML字符串返回。
缺點:此方法可能需要依賴office,網友回復反饋;另外需要用html進行格式處理,也是個麻煩事情。
效果:
二、Spire組件實現
邏輯是首先使用Spire.XLS庫加載Excel文件,并使用Spire.PDF庫創建PDF文檔。然后,我們遍歷Excel文件的每個工作表,將表格內容逐個繪制到PDF頁面上。
使用方法
1、首先使用“NuGet 包管理器”安裝Spire。注意的是需要安裝Spire,不要安裝Spire.XLS和Spire.PDF否則會出現不兼容的問題。
2、在代碼頁面引用
using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Xls;
3、只需要建一個方法ConvertExcelToPdf。傳入要轉換的excel路徑和輸出的路徑,代碼如下:
public static void ConvertExcelToPdf(string excelFilePath, string pdfFilePath)
{
// 加載Excel文件
Workbook workbook=new Workbook();
workbook.LoadFromFile(excelFilePath);
// 創建PDF文檔
PdfDocument pdfDocument=new PdfDocument();
// 添加Excel表格內容到PDF
foreach (Worksheet sheet in workbook.Worksheets)
{
PdfPageBase pdfPage=pdfDocument.Pages.Add();
PdfDocument document=new PdfDocument();
PdfTrueTypeFont fonts=new PdfTrueTypeFont(@"C:\Windows\Fonts\simfang.ttf", 10f);
// 獲取Excel表格的行數和列數
int rowCount=sheet.LastRow + 1;
int columnCount=sheet.LastColumn + 1;
// 將Excel表格內容逐個添加到PDF
for (int row=1; row <=rowCount; row++)
{
for (int column=1; column <=columnCount; column++)
{
string value=sheet.Range[row, column].Text;
if (value !=null)
// 繪制單元格內容到PDF頁面
{
pdfPage.Canvas.DrawString(value, fonts, PdfBrushes.Black, column * 70, row * 20);
}
}
}
}
// 保存PDF文件
pdfDocument.SaveToFile(pdfFilePath);
Console.WriteLine("PDF轉換完成。");
}
//調用方法跟上面一樣
此方法需要注意的是Spire默認不支持中文,需要我們單獨引用中文字庫,在代碼的13行就是引用字庫的地方,大家可以把字庫拷貝到自己的項目引用。
缺點:默認不支持中文字庫,需要單獨引用;另外輸出格式不帶表格(可能可以調);免費版本有水印,這個網上有解決方案,大家可以去某度搜索。
效果如下:
三、NPOI和iTextSharp組件實現
邏輯是通過使用NPOI庫讀取Excel文件,然后使用iTextSharp庫創建PDF文檔。
使用方法
1、首先使用“NuGet 包管理器”安裝NPOI和iTextSharp。
2、在代碼頁面引用
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using iTextSharp.text;
using iTextSharp.text.pdf;
3、需要建二個方法,ConvertExcelToPdf和GetChineseFont方法,GetChineseFont主要作業是字符格式轉換。ConvertExcelToPdf傳入要轉的excel路徑和輸出的路徑,代碼如下:
public static void ConvertExcelToPdf2(string excelFilePath, string pdfFilePath)
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// 加載Excel文件
using (FileStream fileStream=new FileStream(excelFilePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook=new XSSFWorkbook(fileStream);
ISheet sheet=workbook.GetSheetAt(0);
// 創建PDF文檔
Document document=new Document();
// 創建PDF寫入器
PdfWriter writer=PdfWriter.GetInstance(document, new FileStream(pdfFilePath, FileMode.Create));
// 打開PDF文檔
document.Open();
// 添加Excel表格內容到PDF
PdfPTable table=new PdfPTable(sheet.GetRow(0).LastCellNum);
table.WidthPercentage=100;
foreach (IRow row in sheet)
{
foreach (ICell cell in row)
{
string value=cell.ToString();
PdfPCell pdfCell=new PdfPCell(new Phrase(value, GetChineseFont()));
table.AddCell(pdfCell);
}
}
document.Add(table);
// 關閉PDF文檔
document.Close();
}
Console.WriteLine("PDF轉換完成。");
}
static Font GetChineseFont()
{
var baseFont=BaseFont.CreateFont(@"C:\Windows\Fonts\simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
return new Font(baseFont, 12);
}
//調用方法跟方法一一樣
//歡迎關注公眾號:DOTNET開發跳槽,領取海量面試題。加微信號xbhpnet入群交流
此方法跟Spire一樣默認不支持中文,需要我們單獨引用中文字庫,方法GetChineseFont就是處理引用中文字庫。另外需要需要在 NuGet 里添加 System.Text.Encoding.CodePages并注冊,否則會報錯,注冊如下。
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
缺點:此方法也比較坑,不支持中文,還需要引用額外的字庫支持組件CodePages。
效果如下:
結語
本文介紹了.NET三種方法實現Excel轉pdf,他們各有優點,第一種可以自定義樣式,第二種依賴獨立組件,第三種顯示效果更佳,從使用效果來看小編推薦第三種。其實還有很多組件實現Excel轉pdf,比如Aspose.Cells,有的需要授權收取費用、大家自己可以研究一下。本項目是基于.NET7在windows下測試運行,在linux下沒有實驗過,大家可以嘗試一下。大家還有什么好的方式實現Excel轉pdf呢?歡迎留言討論。
sp.net為了縮短開發周期,搭建了一個快速開發平臺。
如果是做OA、CRM、ERP一類的管理系統,如果為了縮短開發周期,搭建一個快速開發平臺,再配合一些快速開發的組件開發效率能提高很多。
1.框架用到的技術
(1)前臺技術:ajax+Jquery+jqgrid+Bootstrap
(2)開發環境:VS2015-VS2019
(3)數據庫:SQL Server,Oracle、Mysql
(5)后臺技術:ASP.NET MVC,TinyIoc(IoC容器),EF(ORM框架),layui框架或vue,Log4Net,NPOI等
2.框架主要功能展示
手機端是通過html做前端開發,通過ajax與后臺webapi接口做交互。開發完成后可以打包成應用提供給用戶下載
https://www.cnblogs.com/Ajoying/p/8005032.html
for(int i=0; i < GoodList.Count; i++)
{
string name=GoodList[i].title;
string cover=GoodList[i].cover;
using(WebClient client=new WebClient())
{
//client.DownloadFile(new Uri(cover), $"{rootPath}\{name}.png");
// OR
try
{
client.DownloadFile(new Uri(cover), $ "{rootPath}\{i+1}.jpeg");
Thread.Sleep(50);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
this.BeginInvoke(new Action(()=>
{
MyProgressBar.Value=i;
}));
}
3、把緩存的圖片插入到指定的單元格內:
string imagePath=$ "{AppDomain.CurrentDomain.BaseDirectory}Cache\{rowIndex}.jpeg";
//從本地獲取
var bytes=File.ReadAllBytes(imagePath);
if(bytes != && bytes.Length !=0)
{
//byte[] bytes=System.IO.File.ReadAllBytes(datarow["picture"].ToString());
int pictureIdx=workbook.AddPicture(bytes, PictureType.JPEG);
HSSFPatriarch patriarch=(HSSFPatriarch) sheet.CreateDrawingPatriarch();
HSSFClientAnchor anchor=new HSSFClientAnchor(70, 40, 0, 0, 1, rowIndex, 0, rowIndex + 1);
//把圖片插到相應的位置
HSSFPicture pict=(HSSFPicture) patriarch.CreatePicture(anchor, pictureIdx);
// 指定我想要的長寬
double standardWidth=220;
double standardHeight=100;
// 計算單元格的長寬
double cellWidth=sheet.GetColumnWidthInPixels(cell.ColumnIndex);
double cellHeight=cell.Row.HeightInPoints / 72 * 96;
// 計算需要的長寬比例的系數
double a=standardWidth / cellWidth;
double b=standardHeight / cellHeight;
pict.Resize(a, b);
}
最終簡單的效果先這樣吧;以后有時間的話,可以再去摸索一下更復雜的效果;編程不息、Bug不止、無Bug、無生活;改bug的冷靜、編碼的激情、完成后的喜悅、挖坑的激動 、填坑的興奮;這也許就是屌絲程序員的樂趣吧;今天就到這里吧;希望自己有動力一步一步堅持下去;生命不息,代碼不止;大家抽空可以看看今天分享的效果,有好的意見和想法,可以在留言板隨意留言;我看到后會第一時間回復大家,多謝大家的一直默默的關注和支持!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。