自制 Word、Excel 批转 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 String, ByVal 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 String, ByVal 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



自制 Word、Excel 批转 PDF 工具

时间: 2024-11-09 01:22:52

自制 Word、Excel 批转 PDF 工具的相关文章

Atitit.office&#160;word&#160;&#160;excel&#160;&#160;ppt&#160;pdf&#160;的web在线预览方案与html转换方案&#160;attilax&#160;总结

Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结 1. office word  excel pdf 的web预览要求1 1.1. 显示效果要好1 1.2. 可以自定义显示界面1 1.3. 不需要控件,兼容性好1 1.4. 支持编辑操作1 2. 纯html预览解决之道(自由的格式)1 3. 转换swf flash方案2 4. 转换pdf方式..更多的浏览器已经直接支持pdf格式查看2 5. 控件方式2 6. Hyb

lucent检索技术之创建索引:使用POI读取txt/word/excel/ppt/pdf内容

在使用lucent检索文档时,必须先为各文档创建索引.索引的创建即读出文档信息(如文档名称.上传时间.文档内容等),然后再经过分词建索引写入到索引文件里.这里主要是总结下读取各类文档内容这一步. 一.之前做过一个小工具也涉及到读取word和excel内容,采用的是com组件的方式来读取.即导入COM库,引入命名空间(using Microsoft.Office.Interop.Word;using Microsoft.Office.Interop.Excel;),然后读代码如下: 读取word

关于在线预览word,excel,ppt,pdf的需求处理方法。

参考文档:http://www.cnblogs.com/wolf-sun/p/3574278.html 我选用的方案:先用office com组件生成pdf,然后使用pdf.js在线预览pdf文档.在自己写demo的过程下遇到如下两个问题,在此记录一下,希望能帮助到遇到同类问题的兄弟姐妹们.   1.在服务器上安装Office Plus 2010后,使用其com组件生成pdf时出现权限错误 System.UnauthorizedAccessException: Retrieving the CO

PDF/WORD/EXCEL 图片预览

一.PDF/WORD/EXCEL 转 XPS 转 第一页内容 转 图片 WORD.EXCEL转XPS (Office2010) public bool WordToXPS(string sourcePath, string targetPath) { bool result = false; Microsoft.Office.Interop.Word.WdExportFormat exportFormat = Microsoft.Office.Interop.Word.WdExportForma

excel转pdf,itextpdf转换excel

最近项目有需求,需要把excel转pdf.由于时间比较急,所以在github上找了一个转换的.最终没用上,但还是踩坑了一波. 踩坑一: 首先,这个是导出的流之间会互相影响,因为流读取过,导致导出的excle文件没有数据,所以要new 新的流 踩坑二: github上找的excel转pdf工具类,本来以为挺简单的.大意了,搞了很久发现工具类有问题,项目还着急提测.导致我被pm说了一波. 原工具类地址:https://github.com/caryyu/excel2pdf 我完善过的工具类:http

Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑",如果是两个字那就是"巨坑"=>因为这个需求一开始并不是这样子的,且听我漫漫道来: 一开始客户与我们商量的是将office和PDF上传,将此类文件解析成html格式,在APP端调用内置server直接以html"播放" 经历一个月~,两个月~,三个月~~~

java操作office和pdf文件java读取word,excel和pdf文档内容

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip 

PDF→Excel格式转换工具集锦!

1. Free PDF to Excel Converter Free PDF to Excel Converter是一个把PDF文件转换为Excel格式的多功能免费程序.它支持批量处理,同时也支持XLSX和XLS以及CSV三种输出格式你可以在它的工具栏上点击"添加PDF文件"或者"添加文件夹"来转换PDF文件.添加文件之后点击转换按钮就开始处理程序了.你也可以只点击需要处理的页面,合并所有的PDF文件到一个Excel文件.它会试图保留格式,但可能不完全成功,但是所

java操作word,excel,pdf

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip