C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数

C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数

  • 1.前言
  • 2.Excel页数的特殊性
  • 3.获取Excel页数的代码
  • 4.后记

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的时候,都是基于这个分页符来控制页数。如下图:
C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数_第1张图片
然后在“分页视图”中,就可以查看到Excel的分页效果了,如下图:
C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数_第2张图片
如果不手动插入分页符,那么在打印的时候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的类,如下图:
C#编写ASP.NET Core的Web API并部署到IIS上的详细教程(API用于准确获取Word/Excel/PPT/PDF的页数)4 -获取Excel的页数_第3张图片
代码如下:

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;
        }

        /// 
        /// 处理转换为PDF的文件
        /// 
        /// 上传的Excle的文件路径
        /// 
        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;//得到转换后的文件名 
        }

        /// 
        /// 将excel文档转换成PDF或者XPS格式
        /// 
        /// 需要转换的文件路径
        /// 转换好的之后 需要保存的文件路径
        /// 这是个枚举类型,可以选择是PDF还是XPS
        /// 
        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;
        }

        /// 
        /// 关闭Excel的方法
        /// 
        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);
        }

        /// 
        /// 杀掉Excel的死进程
        /// 
        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类,及项目调试》

你可能感兴趣的:(C#,.NET)