整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          三種方法讓.NET輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF

          三種方法讓.NET輕松實(shí)現(xiàn)Excel轉(zhuǎn)PDF

          一段時(shí)間有網(wǎng)友問Excel轉(zhuǎn)pdf怎么轉(zhuǎn)pdf,小編幫他實(shí)現(xiàn)了一個(gè),方法是使用EPPlus和PdfSharp組件實(shí)現(xiàn),由于依賴OfficeOpenXml他也沒有用上,后來小編又實(shí)現(xiàn)了二種不依賴OfficeOpenXml的方法。本文將介紹這三種方法實(shí)現(xiàn)Excel轉(zhuǎn)pdf。

          一、EPPlus和PdfSharp組件實(shí)現(xiàn)

          邏輯是先將Excel內(nèi)容轉(zhuǎn)換為HTML字符串,然后再將HTML字符串轉(zhuǎn)換為PDF文件。轉(zhuǎn)換過程中的格式和樣式可能會(huì)有一些差異,您可能需要根據(jù)需求進(jìn)行進(jìn)一步的調(diào)整和優(yōu)化。

          使用方法

          1、首先使用“NuGet 包管理器”安裝EPPlus和PdfSharp

          2、在代碼頁面引用

          using IronPdf;
          using OfficeOpenXml;
          

          3、建兩個(gè)方法ConvertExcelToPdf和ExcelToHtml

          ConvertExcelToPdf方法用于將Excel文件轉(zhuǎn)換為PDF文件,ExcelToHtml這個(gè)方法將Excel工作表的內(nèi)容轉(zhuǎn)換為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]; // 假設(shè)要轉(zhuǎn)換的工作表是第一個(gè)工作表
          
                          // 創(chuàng)建一個(gè)HTML字符串,將Excel內(nèi)容轉(zhuǎn)換為HTML
                          string htmlContent=ExcelToHtml(worksheet);
          
                          // 使用IronPDF將HTML字符串轉(zhuǎn)換為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();
                  }
          
            //調(diào)用方法
          string excelFilePath="C:\\Users\\user\\Desktop\\test.xlsx";
          string pdfFilePath="C:\\Users\\user\\Desktop\\test.pdf";
          exceltopdf.ConvertExcelToPdf(excelFilePath, pdfFilePath);
          

          主要有兩個(gè)方法:

          ConvertExcelToPdf: 這個(gè)方法用于將Excel文件轉(zhuǎn)換為PDF文件。它首先使用ExcelPackage類從Excel文件中讀取數(shù)據(jù)。然后,調(diào)用ExcelToHtml方法將Excel內(nèi)容轉(zhuǎn)換為HTML字符串。接下來,使用IronPDF庫中的HtmlToPdf類將HTML字符串轉(zhuǎn)換為PDF對(duì)象。最后,將PDF對(duì)象保存到指定的PDF文件路徑中。

          ExcelToHtml: 這個(gè)方法將Excel工作表的內(nèi)容轉(zhuǎn)換為HTML字符串。它使用StringBuilder來構(gòu)建HTML字符串。首先,它添加

          標(biāo)簽作為表格的開始。然后,通過遍歷工作表的行和列,將每個(gè)單元格的值添加到HTML字符串中作為一個(gè)td元素。最后,添加table標(biāo)簽作為表格的結(jié)束,并將構(gòu)建好的HTML字符串返回。

          缺點(diǎn):此方法可能需要依賴office,網(wǎng)友回復(fù)反饋;另外需要用html進(jìn)行格式處理,也是個(gè)麻煩事情。

          效果:

          、Spire組件實(shí)現(xiàn)

          邏輯是首先使用Spire.XLS庫加載Excel文件,并使用Spire.PDF庫創(chuàng)建PDF文檔。然后,我們遍歷Excel文件的每個(gè)工作表,將表格內(nèi)容逐個(gè)繪制到PDF頁面上。

          使用方法

          1、首先使用“NuGet 包管理器”安裝Spire。注意的是需要安裝Spire,不要安裝Spire.XLS和Spire.PDF否則會(huì)出現(xiàn)不兼容的問題。

          2、在代碼頁面引用

          using Spire.Pdf;
          using Spire.Pdf.Graphics;
          using Spire.Xls;
          

          3、只需要建一個(gè)方法ConvertExcelToPdf。傳入要轉(zhuǎn)換的excel路徑和輸出的路徑,代碼如下:

             public static void ConvertExcelToPdf(string excelFilePath, string pdfFilePath)
                  {
                      // 加載Excel文件
                      Workbook workbook=new Workbook();
                      workbook.LoadFromFile(excelFilePath);
                      // 創(chuàng)建PDF文檔
                      PdfDocument pdfDocument=new PdfDocument();
                      // 添加Excel表格內(nèi)容到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表格的行數(shù)和列數(shù)
                          int rowCount=sheet.LastRow + 1;
                          int columnCount=sheet.LastColumn + 1;
                          // 將Excel表格內(nèi)容逐個(gè)添加到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)
                                  // 繪制單元格內(nèi)容到PDF頁面
                                  {
                                      pdfPage.Canvas.DrawString(value, fonts, PdfBrushes.Black, column * 70, row * 20);
                                  }
                              }
                          }
                      }
                      // 保存PDF文件
                      pdfDocument.SaveToFile(pdfFilePath);
                      Console.WriteLine("PDF轉(zhuǎn)換完成。");
                  }
            //調(diào)用方法跟上面一樣
          

          此方法需要注意的是Spire默認(rèn)不支持中文,需要我們單獨(dú)引用中文字庫,在代碼的13行就是引用字庫的地方,大家可以把字庫拷貝到自己的項(xiàng)目引用。

          缺點(diǎn):默認(rèn)不支持中文字庫,需要單獨(dú)引用;另外輸出格式不帶表格(可能可以調(diào));免費(fèi)版本有水印,這個(gè)網(wǎng)上有解決方案,大家可以去某度搜索。

          效果如下:

          三、NPOI和iTextSharp組件實(shí)現(xiàn)

          邏輯是通過使用NPOI庫讀取Excel文件,然后使用iTextSharp庫創(chuàng)建PDF文檔。

          使用方法

          1、首先使用“NuGet 包管理器”安裝NPOI和iTextSharp。

          2、在代碼頁面引用

          using NPOI.SS.UserModel;
          using NPOI.XSSF.UserModel;
          using iTextSharp.text;
          using iTextSharp.text.pdf;
          

          3、需要建二個(gè)方法,ConvertExcelToPdf和GetChineseFont方法,GetChineseFont主要作業(yè)是字符格式轉(zhuǎn)換。ConvertExcelToPdf傳入要轉(zhuǎn)的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);
                          // 創(chuàng)建PDF文檔
                          Document document=new Document();
                          // 創(chuàng)建PDF寫入器
                          PdfWriter writer=PdfWriter.GetInstance(document, new FileStream(pdfFilePath, FileMode.Create));
                          // 打開PDF文檔
                          document.Open();
                          // 添加Excel表格內(nèi)容到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);
                          // 關(guān)閉PDF文檔
                          document.Close();
                      }
                      Console.WriteLine("PDF轉(zhuǎn)換完成。");
                  }
                  static Font GetChineseFont()
                  {
                      var baseFont=BaseFont.CreateFont(@"C:\Windows\Fonts\simfang.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                      return new Font(baseFont, 12);
                  }
           //調(diào)用方法跟方法一一樣
          //歡迎關(guān)注公眾號(hào):DOTNET開發(fā)跳槽,領(lǐng)取海量面試題。加微信號(hào)xbhpnet入群交流
          

          此方法跟Spire一樣默認(rèn)不支持中文,需要我們單獨(dú)引用中文字庫,方法GetChineseFont就是處理引用中文字庫。另外需要需要在 NuGet 里添加 System.Text.Encoding.CodePages并注冊(cè),否則會(huì)報(bào)錯(cuò),注冊(cè)如下。

          Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
          

          缺點(diǎn):此方法也比較坑,不支持中文,還需要引用額外的字庫支持組件CodePages。

          效果如下:

          結(jié)語

          本文介紹了.NET三種方法實(shí)現(xiàn)Excel轉(zhuǎn)pdf,他們各有優(yōu)點(diǎn),第一種可以自定義樣式,第二種依賴獨(dú)立組件,第三種顯示效果更佳,從使用效果來看小編推薦第三種。其實(shí)還有很多組件實(shí)現(xiàn)Excel轉(zhuǎn)pdf,比如Aspose.Cells,有的需要授權(quán)收取費(fèi)用、大家自己可以研究一下。本項(xiàng)目是基于.NET7在windows下測(cè)試運(yùn)行,在linux下沒有實(shí)驗(yàn)過,大家可以嘗試一下。大家還有什么好的方式實(shí)現(xiàn)Excel轉(zhuǎn)pdf呢?歡迎留言討論。

          sp.net為了縮短開發(fā)周期,搭建了一個(gè)快速開發(fā)平臺(tái)。



          如果是做OA、CRM、ERP一類的管理系統(tǒng),如果為了縮短開發(fā)周期,搭建一個(gè)快速開發(fā)平臺(tái),再配合一些快速開發(fā)的組件開發(fā)效率能提高很多。



          1.框架用到的技術(shù)

          (1)前臺(tái)技術(shù):ajax+Jquery+jqgrid+Bootstrap

          (2)開發(fā)環(huán)境:VS2015-VS2019

          (3)數(shù)據(jù)庫:SQL Server,Oracle、Mysql

          (5)后臺(tái)技術(shù):ASP.NET MVC,TinyIoc(IoC容器),EF(ORM框架),layui框架或vue,Log4Net,NPOI等

          2.框架主要功能展示

          手機(jī)端是通過html做前端開發(fā),通過ajax與后臺(tái)webapi接口做交互。開發(fā)完成后可以打包成應(yīng)用提供給用戶下載

          顧上次更新文章已經(jīng)過去一個(gè)多月了;今天正好趁著空閑時(shí)間趕緊來分享一篇最近幫一個(gè)老哥實(shí)現(xiàn)的效果,二話不多說直接看效果:
          1、使用NPOI把集合對(duì)象轉(zhuǎn)Excel文件,參考:
          https://www.cnblogs.com/Ajoying/p/8005032.html
          2、關(guān)于圖片我是提前把他們緩存到本地了:
          • 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、把緩存的圖片插入到指定的單元格內(nèi):

            • 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); //把圖片插到相應(yīng)的位置 HSSFPicture pict=(HSSFPicture) patriarch.CreatePicture(anchor, pictureIdx); // 指定我想要的長(zhǎng)寬 double standardWidth=220; double standardHeight=100; // 計(jì)算單元格的長(zhǎng)寬 double cellWidth=sheet.GetColumnWidthInPixels(cell.ColumnIndex); double cellHeight=cell.Row.HeightInPoints / 72 * 96; // 計(jì)算需要的長(zhǎng)寬比例的系數(shù) double a=standardWidth / cellWidth; double b=standardHeight / cellHeight; pict.Resize(a, b);}

              最終簡(jiǎn)單的效果先這樣吧;以后有時(shí)間的話,可以再去摸索一下更復(fù)雜的效果;編程不息、Bug不止、無Bug、無生活;改bug的冷靜、編碼的激情、完成后的喜悅、挖坑的激動(dòng) 、填坑的興奮;這也許就是屌絲程序員的樂趣吧;今天就到這里吧;希望自己有動(dòng)力一步一步堅(jiān)持下去;生命不息,代碼不止;大家抽空可以看看今天分享的效果,有好的意見和想法,可以在留言板隨意留言;我看到后會(huì)第一時(shí)間回復(fù)大家,多謝大家的一直默默的關(guān)注和支持!


          主站蜘蛛池模板: 国产一区二区精品在线观看| 国产综合精品一区二区| 无码少妇A片一区二区三区| 国产欧美一区二区精品仙草咪| 国产午夜一区二区在线观看| 精品少妇ay一区二区三区| www一区二区三区| 白丝爆浆18禁一区二区三区| 亚洲国产美女福利直播秀一区二区| 色噜噜一区二区三区| 国产成人精品无码一区二区老年人| 人妻少妇久久中文字幕一区二区| 亚洲高清成人一区二区三区| 久久精品国产一区二区三区不卡| 久草新视频一区二区三区| 人妻免费一区二区三区最新| 亚洲线精品一区二区三区 | 欧洲精品码一区二区三区免费看 | 国产在线精品一区在线观看| 丰满人妻一区二区三区视频53| 制服中文字幕一区二区| 亚洲日韩精品一区二区三区| 无码人妻精品一区二区三区99仓本 | 精品欧洲AV无码一区二区男男| 亚洲熟女综合色一区二区三区| 国产精品久久久久一区二区三区| 成人h动漫精品一区二区无码| 国产日韩AV免费无码一区二区| 国产精品香蕉一区二区三区| 欧美日韩精品一区二区在线观看| 麻豆果冻传媒2021精品传媒一区下载 | 欧洲精品码一区二区三区| 国产自产V一区二区三区C| 成人区人妻精品一区二区不卡| 国产一区二区三区不卡在线看| 中文字幕一区二区免费| 好湿好大硬得深一点动态图91精品福利一区二区 | 在线精品自拍亚洲第一区| 成人一区二区免费视频| 中文字幕一区二区三区在线观看| 日韩一区二区在线播放|