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.前言

本文是接:
《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類,及項目調試》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章