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类,及项目调试》