自制 Word、Excel 批转 PDF 工具

简介: 原文:自制 Word、Excel 批转 PDF 工具目前做金融业的项目,该公司每天会产生很多 Word、Excel 文档,需要大量地转换为 PDF,除了自己保存外,也要给金融主管机构作为备份。由于文档数量很多,希望有工具能在下班前、作完设置后,放着让机器自动、大量地批转;除此之外,亦希望有特殊的功能,例如给主管机构的 Excel 文档,能仅选择其中某几个 sheet (工作表) 转成 PDF。
原文: 自制 Word、Excel 批转 PDF 工具

目前做金融业的项目,该公司每天会产生很多 Word、Excel 文档,需要大量地转换为 PDF,除了自己保存外,也要给金融主管机构作为备份。由于文档数量很多,希望有工具能在下班前、作完设置后,放着让机器自动、大量地批转;除此之外,亦希望有特殊的功能,例如给主管机构的 Excel 文档,能仅选择其中某几个 sheet (工作表) 转成 PDF。 我找了网络上许多 PDF 转换工具,没有完全符合上述需求的,只好自己用 .NET / VSTO 写一个。

开发环境:
(1) VS 2008 / Windows Form / VB.NET / VSTO
(2) Office 2007 或 Office 2010 或更高版本 (需要引用新版 Office 里的 COM 组件)
(3) 2007 Microsoft Office 加载项:Microsoft Save as PDF 或 XPS (可将 Office 2007 或更高版本的文件,导出成 PDF 或 XPS 文件)

执行环境:
(1) .NET Framework
(2) Office 2007 或 Office 2010 或更高版本 (旧版的 Office XP / Office 2003 不行)
(3) 2007 Microsoft Office 加载项:Microsoft Save as PDF 或 XPS (可将 Office 2007 或更高版本的文件,导出成 PDF 或 XPS 文件)

特性:
(1) 支持中文文件名 (免费的 PDFCreator 从 1.2.x 版后即不支持)、中文目录、中文命名的 sheet。
(2) 可选择 Excel 的某一个或某几个 sheet,整合转换成「单一个」PDF (Adobe Acrobat Standard 亦无此功能,要很贵的 Adobe Acrobat Professional 才有)。
(3) 可选择 Excel 的某一个或某几个 sheet,「各自」转换成一个 PDF (我在网络上未找到具备此功能的软件)。
(4) 批转的速度很快,大量批转时亦不曾发生程序崩溃,或占据 Word、Excel 文件资源不释放的情形。
(5) 可处理 Excel 里,整个 sheet 内容全为空白的不正常情形。

-------------------------------------------------
本帖的示例下载点:
http://files.cnblogs.com/WizardWu/120930.zip
附源码。若需要简体中文介面的网友,请自行用 VS 开启项目后,改写及编译。
---------------------------------------------------

执行画面


图 1 直接双击 .exe 执行


图 2 分为两大功能


功能一 - 大批文件转换


图 3 功能一,批转多个目录里的 Word、Excel 文档 - 转换前


图 4 功能一,批转多个目录里的 Word、Excel 文档 - 转换后 

 

关键代码 (大批文件转换)
'''   <summary>
'''  Word 轉 PDF
'''   </summary>
'''   <param name="PathAndFileName"> 路徑名\檔名.副檔名 </param>
Public  Sub ConvertWordToPDF( ByVal PathAndFileName  As  String)
     Dim mstrResultFormPath  As  String = PathAndFileName
     Dim strPDFFileName  As  String = Path.ChangeExtension(mstrResultFormPath,  " .pdf ")
     Dim docApp  As  Object =  CreateObject( " Word.Application ")
     Dim docDoc  As  Object = docApp.Documents.Open(mstrResultFormPath)
     Try
         ' ExportFormat: 指定要以 PDF 還是 XPS 格式儲存文件
        docDoc.ExportAsFixedFormat(OutputFileName:=strPDFFileName, ExportFormat:= 17)
     Catch ex  As Exception
         Throw  New Exception( " 轉換 Word 檔  " & PathAndFileName &  "  時發生錯誤,錯誤為: " & ex.Message)
     Finally
        docApp.Documents.Close()
        docApp.Quit()
     End  Try
End Sub


'''   <summary>
'''  Excel 轉 PDF (可有空白 sheet)
'''   </summary>
'''   <param name="PathAndFileName"> 路徑名\檔名.副檔名 </param>
Public  Sub ConvertExcelToPDF( ByVal PathAndFileName  As  String)
     ' Dim ws As Excel.Worksheet

     Dim mstrResultFormPath  As  String = PathAndFileName   ' 例:d:\excelTestPDF.xls
     Dim strPDFFileName  As  String = Path.ChangeExtension(mstrResultFormPath,  " .pdf ")
     Dim xlsApp  As  Object =  CreateObject( " Excel.Application ")
     Dim xlsWBook  As  Object = xlsApp.Workbooks.Open(mstrResultFormPath)
     Try
        xlsWBook.ExportAsFixedFormat(Type:= 0, Filename:=strPDFFileName, IgnorePrintAreas:= False, OpenAfterPublish:= False, IncludeDocProperties:= True, Quality:=Excel.XlFixedFormatQuality.xlQualityStandard)
     Catch ex  As Exception
         Throw  New Exception( " 轉換 Excel 檔  " & PathAndFileName &  "  時發生錯誤,錯誤為: " & ex.Message)
     Finally
        xlsApp.Workbooks.Close()
        xlsApp.Quit()
     End  Try
End Sub

 


功能二 - Excel 特定 sheet 转换


图 5 功能二,可选择 Excel 的某一个或某几个 sheet,整合转换成「单一个」PDF

 

关键代码 (Excel 的某一个或某几个 sheet,整合转换成「单一个」PDF)
' 勾選的 sheet 轉成單一個 PDF 檔 (若選到空白的 sheet,不會出錯,但不會印出來)
Public  Sub ConvertCheckedSheetToOnePDF( ByVal PathAndFileName  As  StringByVal listChecked  As List( Of  String),  ByVal listUnChecked  As List( Of  String))
     Dim oExcel  As  New Excel.Application
     Dim oBooks  As Excel.Workbooks, oBook  As Excel.Workbook
     Dim oSheets  As Excel.Sheets
     ' Dim oSheet As Excel.Worksheet
     Dim sTemplate  As  String, sFileName  As  String

     ' Excel 檔路徑
    sTemplate = PathAndFileName
     ' 捉路徑+檔名(不含副檔名)
    sFileName = PathAndFileName.Substring( 0, PathAndFileName.LastIndexOf( " . "))

    oExcel.Visible =  False
    oExcel.DisplayAlerts =  False

    oBooks = oExcel.Workbooks
    oBooks.Open(sTemplate)
    oBook = oBooks.Item( 1)
    oSheets = oBook.Worksheets

     ' 將沒勾選的 Worksheet,從 Workbook 裡移除
     If  Not listUnChecked  Is  Nothing  Then
         If listUnChecked.Count >  0  Then
             Dim sheetDelete  As Excel.Worksheet =  Nothing     ' 暫存用

             For  Each s_unC  In listUnChecked
                 ' oBook.Sheets(s_unC).Delete()   '這種寫法,會引發: 無效的索引 (發生例外狀況於 HRESULT: 0x8002000B (DISP_E_BADINDEX」

                sheetDelete = oBook.Sheets(s_unC)    ' 依 sheet 的中文名稱,作為移除的依據
                 If  Not sheetDelete  Is  Nothing  Then
                    sheetDelete.Delete()
                 End  If

                sheetDelete =  Nothing
             Next
         End  If
     End  If

    oBook.ExportAsFixedFormat(Type:=Excel.XlFixedFormatType.xlTypePDF, Filename:=sFileName &  " .pdf ", Quality:=Excel.XlFixedFormatQuality.xlQualityStandard, IncludeDocProperties:= True, IgnorePrintAreas:= False, OpenAfterPublish:= False)

 

 


图 6 功能二,可选择 Excel 的某一个或某几个 sheet,各自转换成一个 PDF

 

关键代码 (Excel 的某一个或某几个 sheet,「各自」转换成一个 PDF)
' 勾選的 sheet 各轉成一個 PDF 檔 (若選到空白的 sheet,該 sheet 的轉換會失敗)
Public  Sub ConvertCheckedSheetToMultiplePDF( ByVal PathAndFileName  As  StringByVal listChecked  As List( Of  String))
     Dim oExcel  As  New Excel.Application
     Dim oBooks  As Excel.Workbooks, oBook  As Excel.Workbook
     Dim oSheets  As Excel.Sheets
     Dim oSheet  As Excel.Worksheet
     Dim sTemplate  As  String, sFileName  As  String

     '  Excel 檔路徑
    sTemplate = PathAndFileName
     ' 捉路徑+檔名(不含副檔名)
    sFileName = PathAndFileName.Substring( 0, PathAndFileName.LastIndexOf( " . "))

    oExcel.Visible =  False
    oExcel.DisplayAlerts =  False

    oBooks = oExcel.Workbooks
    oBooks.Open(sTemplate)
    oBook = oBooks.Item( 1)
    oSheets = oBook.Worksheets

     For i  As  Integer =  0  To listChecked.Count -  1
        ProgressBar1.PerformStep()   ' 進度列

         ' ss &= listChecked(i) & vbCrLf
        oSheet =  CType(oSheets.Item(listChecked(i)), Excel.Worksheet)
         ' ss &= oSheet.Name & vbCrLf
        oSheet.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, IncludeDocProperties:= True, OpenAfterPublish:= False, Quality:=Excel.XlFixedFormatQuality.xlQualityStandard, _
                                  Filename:=sFileName &  " _ " & oSheet.Name &  " .pdf ")
     Next

 

 

组件引用


图 7 Office 2007 开发环境。项目需要手动引用三个组件

如上图 7,VS 里需要自行引用 Microsoft Office.Tools.Excel、Microsoft Office.Tools.Word 两个 .NET 组件,以及 Microsoft Excel Object Library 这个 Office 里的 COM 组件。 但需注意,在开发环境中若安装的是 Office 2007,则可引用的 Microsoft Excel Object Library 版本为 1.5 版 (11.0) 或 1.6 版 (12.0),此时编译的程序,可拿至安装 Office 2007 及 Office 2010 的用户机器上执行;但若如下图 8,在开发环境中安装的是 Office 2010,则可引用的 Microsoft Excel Object Library 版本为 1.7 版 (14.0),此时编译的程序,就只能拿至安装 Office 2010 的用户机器上执行,若拿至安装 Office 2007 的用户机器上会无法执行。


图 8 Office 2010 开发环境。项目需要手动引用三个组件


结论

此种转换功能,亦可写成 ASP.NET 网页介面,但不建议。因转化动作极耗系统资源,若大量批转容易造成 IIS 死机,且 IIS_WPG、Network Service 群组默认的权限不足,需要另外处理权限、安全性的设置。




参考文章:


Word 及 Excel 的 Workbook.ExportAsFixedFormat Method
http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel.workbook.exportasfixedformat.aspx
http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.word.document.exportasfixedformat.aspx
http://msdn.microsoft.com/en-us/library/office/bb238907%28v=office.12%29.aspx

如何给excel新增工作表 C# (Worksheet 操作大全)
http://topic.csdn.net/u/20080623/14/d47504a2-086b-4449-bffb-4f9ae6b62eb4.html

ASP.NET 產生 PDF 或 XPS 檔 (繁体中文)
http://teacher.syset.com/viewtopic.mspx?t=3911

ASP.NET 產生 PDF 或 XPS 檔 (繁体中文)
http://www.dotblogs.com.tw/rainmaker/archive/2010/01/25/13275.aspx

Merge Workbook With Another Workbook using VSTO
http://social.msdn.microsoft.com/forums/en-US/vsto/thread/85a3dac8-b32a-443a-8601-4e95935fe368

Printing multiple worksheets as seperate PDF files
http://www.mrexcel.com/forum/excel-questions/646486-printing-multiple-worksheets-seperate-pdf-files.html
http://en.allexperts.com/q/Excel-1059/2010/4/converting-worksheets-workbook-separate.htm

ASP.NET调用COM Word转Pdf之我见
http://www.haogongju.net/art/1055828

Print To PDF Using Microsoft's PDF/XPS Add-in
http://www.excelguru.ca/content.php?170-Print-To-PDF-Using-Microsoft-s-PDF-XPS-Add-in
http://www.excelguru.ca/content.php?161

How do I export multiple sheets/charts to a single PDF, but not the entire workbook ? (此做法有缺陷)
http://social.msdn.microsoft.com/Forums/pl-PL/exceldev/thread/7b16b912-5356-4c3c-b517-6f1c91d26d72

VSTO 入门 (Visual Studio Tools for Office)
http://msdn.microsoft.com/zh-cn/library/23cw517s%28v=vs.80%29.aspx 



参考书籍:

Visual Studio Tools for Office 2007
http://www.silverlightchina.net/html/download/books/2010/1008/2473.html 



相关文章:

利用Office Save as PDF or XPS 实现Office批传PDF
http://www.cnblogs.com/mecity/archive/2011/06/23/2087973.html

Convert Word-Documents to PDF on an ASP.NET Server
http://www.codeproject.com/Articles/38592/Convert-Word-Documents-to-PDF-on-an-ASP-NET-Server

Excel VBA - WorkSheet新增、複製、刪除(不出現提示視窗)
http://tgw1029.blogspot.tw/2010/01/excel-vba-worksheet.html
http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.copy%28VS.80%29.aspx


  

 

目录
相关文章
|
10月前
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1589 0
|
存储 人工智能 文字识别
三款安卓手机word编辑器下载,Microsoft Word,wps office,Word手机版,手机word编辑查看阅读器,PDF转换器apk下载
WPS Office是一款功能强大的办公软件,支持文档编辑、表格处理和演示文稿制作,兼容多种格式并提供丰富的云服务。它具备低内存占用、快速运行的特点,支持跨设备同步与多人协作,内置海量模板及AI辅助功能,如智能写作和PPT自动生成。此外,还可扫描文件、编辑PDF并转换为其他格式,极大提升办公效率,适合手机用户便捷操作。
1298 1
|
11月前
|
监控 Linux 数据安全/隐私保护
Python实现Word转PDF全攻略:从入门到实战
在数字化办公中,Python实现Word转PDF自动化,可大幅提升处理效率,解决格式兼容问题。本文详解五种主流方案,包括跨平台的docx2pdf、Windows原生的pywin32、服务器部署首选的LibreOffice命令行、企业级的Aspose.Words,以及轻量级的python-docx+pdfkit组合。每种方案均提供核心代码与适用场景,并涵盖中文字体处理、表格优化、批量进度监控等实用技巧,助力高效办公自动化。
2202 0
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
976 10
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
【PDF提取内容改名】批量提取PDF指定区域内容重命名PDF文件,PDF自动提取内容命名的方案和详细步骤
本工具可批量提取PDF中的合同编号、日期、发票号等关键信息,支持PDF自定义区域提取并自动重命名文件,适用于合同管理、发票处理、文档归档和数据录入场景。基于iTextSharp库实现,提供完整代码示例与百度、腾讯网盘下载链接,助力高效处理PDF文档。
1539 40
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
数据采集 存储 API
Python爬虫结合API接口批量获取PDF文件
Python爬虫结合API接口批量获取PDF文件
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1607 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具