C#編寫ASP.NET Core的Web API並部署到IIS上的詳細教程(API用於準確獲取Word/Excel/PPT/PDF的頁數)4 -獲取Excel的頁數
1.前言
本文是接:
《C#編寫ASP.NET Core的Web API並部署到IIS上的詳細教程(API用於準確獲取Word/Excel/PPT/PDF的頁數)1 -環境準備及創建項目》
《C#編寫ASP.NET Core的Web API並部署到IIS上的詳細教程(API用於準確獲取Word/Excel/PPT/PDF的頁數)2 -獲取Word的頁數》
《C#編寫ASP.NET Core的Web API並部署到IIS上的詳細教程(API用於準確獲取Word/Excel/PPT/PDF的頁數)3 -獲取PPT和PDF的頁數》
的第四篇。
由於整個系列介紹得很詳細,篇幅較長,所以分成多篇博文進行敘述。個人建議從第一篇博文開始閱讀。
2.Excel頁數的特殊性
在上代碼前,需要先明確Excel的頁數到底是什麼東西。其實很多人理解成了sheet的數量,其實這是不準確的,Excel有個專門控制頁數的功能,叫做“分頁符(Row Break)”,在打印Excel的時候,都是基於這個分頁符來控制頁數。如下圖:
然後在“分頁視圖”中,就可以查看到Excel的分頁效果了,如下圖:
如果不手動插入分頁符,那麼在打印的時候Excel會自動根據sheet的高度進行分割成多頁。
如果是打印整個工作簿,那麼總的頁數即爲每個sheet的頁數之和。
3.獲取Excel頁數的代碼
由於Excel頁數的特殊性,Microsoft.Office.Interop.Excel的包中並沒有提供現成的獲取方法,但是我發現將Excel轉換成PDF後,頁數是完全一致的。因此下文中的代碼的思路是:先將上傳的Excel轉換成PDF,然後讀取PDF文件路徑,調用PDFReader.cs類中讀頁數的方法即可。
獲取Excel頁數,我也單獨封裝成一個Service,其提供如下五種方法:
- 打開Excel,調用轉換成PDF的方法,然後調用讀取PDF頁數的方法,返回頁數;
- 將Excel轉換成PDF的方法,其調用的是轉換Excel文件格式的基礎方法,指定轉換成PDF,然後返回PDF文件的路徑;
- 轉換Excel文件格式的基礎方法,需返回轉換的結果,是成功還是失敗;
- 關閉Excel,退出Excel程序;
- 殺掉Excel的死進程;
在項目的Service文件夾下,添加ExcelReader.cs的類,如下圖:
代碼如下:
using System;
namespace DocReaderWebAPIDemo.Service
{
public class ExcelReader
{
public static int getExcelPageNum(String path)
{
int pageNum = 0;
//Excel的頁數,是取決於Excel裏設置的RowBreak的數量的。Excel轉換成PDF可以保留RowBreak的設置,因此也保持了相同的頁數
String pdfPath = GetSwitchedPDF(path);
pageNum = PDFReader.getPdfPageNum(pdfPath);
//分析完成後,講生成的PDF刪掉,避免留下髒數據
System.IO.File.Delete(pdfPath);
return pageNum;
}
/// <summary>
/// 處理轉換爲PDF的文件
/// </summary>
/// <param name="sourceFilePath">上傳的Excle的文件路徑</param>
/// <returns></returns>
public static string GetSwitchedPDF(string sourceFilePath)
{
String newFilePath = "";
//StringBuilder sb = new StringBuilder();
Microsoft.Office.Interop.Excel.XlFixedFormatType targetType = Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF;
bool result = ConvertExcel(sourceFilePath, sourceFilePath, targetType);//調用轉換Excel的方法
//如果轉換成功
if (result)
{
newFilePath = sourceFilePath + ".pdf";
}
return newFilePath;//得到轉換後的文件名
}
/// <summary>
/// 將excel文檔轉換成PDF或者XPS格式
/// </summary>
/// <param name="sourcePath">需要轉換的文件路徑</param>
/// <param name="targetPath">轉換好的之後 需要保存的文件路徑</param>
/// <param name="targetType">這是個枚舉類型,可以選擇是PDF還是XPS</param>
/// <returns></returns>
public static bool ConvertExcel(string sourcePath, string targetPath, Microsoft.Office.Interop.Excel.XlFixedFormatType targetType)
{
bool result = false;
object missing = Type.Missing;
Microsoft.Office.Interop.Excel.Application myExcelApplication = null;
Microsoft.Office.Interop.Excel.Workbook myExcelWorkbook = null;
try
{
object target = targetPath;
object type = targetType;
//啓動Excel程序
myExcelApplication = new Microsoft.Office.Interop.Excel.Application();
//打開文件
myExcelWorkbook = myExcelApplication.Workbooks.Open(
sourcePath, missing, missing,
missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing);
//轉換格式
myExcelWorkbook.ExportAsFixedFormat(targetType, target, Microsoft.Office.Interop.Excel.XlFixedFormatQuality.xlQualityStandard,
true, false, missing, missing, missing, missing);
result = true;
}
catch (Exception e)
{
throw e;
}
finally
{
//關閉文件,退出Excel程序
CloseExcel(myExcelApplication, myExcelWorkbook);
}
return result;
}
/// <summary>
/// 關閉Excel的方法
/// </summary>
public static void CloseExcel(Microsoft.Office.Interop.Excel.Application excelApplication, Microsoft.Office.Interop.Excel.Workbook excelWorkbook)
{
if (excelWorkbook != null)
{
excelWorkbook.Close(false, Type.Missing, Type.Missing);
}
if (excelApplication != null)
{
excelApplication.Quit();
}
GC.Collect();
KillProcess(excelApplication);
}
/// <summary>
/// 殺掉Excel的死進程
/// </summary>
private static void KillProcess(Microsoft.Office.Interop.Excel.Application excelApplication)
{
System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("EXCEL"); //得到所有Excel進程
foreach (System.Diagnostics.Process p in ps)
{
p.Kill(); //關閉進程
}
}
}
}
4.後記
下一篇:
《C#編寫ASP.NET Core的Web API並部署到IIS上的詳細教程(API用於準確獲取Word/Excel/PPT/PDF的頁數)5 -添加Model類和Controller類,及項目調試》