天天看點

C#對word、excel、pdf等格式檔案的操作總結

一、word

這是我以前工作時寫過的一個業務邏輯處理類,裡面有不少檔案操作的方法,這裡主要關注一下C#對word的操作。裡面的方法可以直接拿出來用,主要是通過word的dot模版來進行建立word、替換word等操作。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

<code>namespace</code> <code>Excel2Word</code>

<code>{</code>

<code>    </code><code>public</code> <code>class</code> <code>BLL</code>

<code>    </code><code>{</code>

<code>        </code><code>private</code> <code>Microsoft.Office.Interop.Word.Application app = </code><code>null</code><code>;</code><code>//全局變量 word應用程式</code>

<code>                        </code> 

<code>        </code><code>/// &lt;summary&gt;</code>

<code>        </code><code>/// 從Excel中讀取資料</code>

<code>        </code><code>/// &lt;/summary&gt;</code>

<code>        </code><code>/// &lt;param name="excelPath"&gt;&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="sheetName"&gt;&lt;/param&gt;</code>

<code>        </code><code>/// &lt;returns&gt;&lt;/returns&gt;</code>

<code>        </code><code>public</code> <code>static</code> <code>DataSet GetDataFromExcel(</code><code>string</code> <code>excelPath, </code><code>string</code> <code>sheetName)</code>

<code>        </code><code>{</code>

<code>            </code><code>DataSet ds = </code><code>new</code> <code>DataSet();</code>

<code>            </code><code>string</code> <code>strConn = </code><code>"Provider=Microsoft.Jet.OleDb.4.0; Data Source="</code> <code>+ excelPath.ToString().Trim() + </code><code>"; Extended Properties=Excel 8.0;"</code><code>;</code>

<code>            </code><code>try</code>

<code>            </code><code>{</code>

<code>                </code><code>using</code> <code>(OleDbConnection conn = </code><code>new</code> <code>OleDbConnection(strConn))</code>

<code>                </code><code>{</code>

<code>                    </code><code>conn.Open();</code>

<code>                    </code><code>OleDbDataAdapter oda = </code><code>new</code> <code>OleDbDataAdapter(</code><code>"select * from ["</code> <code>+ sheetName + </code><code>"]"</code><code>, conn);</code>

<code>                    </code><code>oda.Fill(ds);</code>

<code>                </code><code>}</code>

<code>            </code><code>}</code>

<code>            </code><code>catch</code>

<code>                </code><code>throw</code> <code>new</code> <code>Exception(</code><code>"擷取Excel資料時發生異常..."</code><code>);</code>

<code>            </code><code>return</code> <code>ds;</code>

<code>        </code><code>}</code>

<code>                              </code> 

<code>        </code><code>/// Word文本替換</code>

<code>        </code><code>/// &lt;param name="doc"&gt;文檔&lt;/param&gt;</code>

<code>        </code><code>/// &lt;param name="args"&gt;要替換的内容&lt;/param&gt;</code>

<code>        </code><code>public</code> <code>void</code> <code>ReplaceWord(Document doc, Dictionary&lt;</code><code>string</code><code>, </code><code>string</code><code>&gt; args)</code>

<code>                </code><code>object</code> <code>first = 0;</code>

<code>                </code><code>object</code> <code>last = doc.Characters.Count;</code>

<code>                </code><code>Range range = doc.Range(</code><code>ref</code> <code>first, </code><code>ref</code> <code>last);</code>

<code>                </code><code>Microsoft.Office.Interop.Word.Find finder = range.Find;</code>

<code>                </code><code>finder.ClearFormatting();</code>

<code>                </code><code>object</code> <code>missingValue = Type.Missing;</code>

<code>                </code><code>object</code> <code>replaceArea = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;</code>

<code>                </code><code>foreach</code> <code>(</code><code>var</code> <code>item </code><code>in</code> <code>args)</code>

<code>                    </code><code>object</code> <code>findStr = </code><code>"{"</code> <code>+ item.Key.Trim() + </code><code>"}"</code><code>;</code>

<code>                    </code><code>object</code> <code>replaceStr = item.Value.Trim();</code>

<code>                    </code><code>//替換内容</code>

<code>                    </code><code>finder.Execute(</code><code>ref</code> <code>findStr, </code><code>ref</code> <code>missingValue, </code><code>ref</code> <code>missingValue,</code>

<code>                      </code><code>ref</code> <code>missingValue, </code><code>ref</code> <code>missingValue, </code><code>ref</code> <code>missingValue,</code>

<code>                      </code><code>ref</code> <code>replaceStr, </code><code>ref</code> <code>replaceArea, </code><code>ref</code> <code>missingValue,</code>

<code>                      </code><code>ref</code> <code>missingValue, </code><code>ref</code> <code>missingValue, </code><code>ref</code> <code>missingValue);</code>

<code>                </code><code>return</code><code>;</code>

<code>        </code><code>/// word文檔資源釋放</code>

<code>        </code><code>/// &lt;param name="doc"&gt;要釋放資源的文檔&lt;/param&gt;</code>

<code>        </code><code>public</code> <code>void</code> <code>DisposeWord(Document doc)</code>

<code>                </code><code>object</code> <code>oMissing = System.Reflection.Missing.Value;</code>

<code>                </code><code>if</code> <code>(doc != </code><code>null</code><code>)</code>

<code>                    </code><code>//關閉Word并回收資源</code>

<code>                    </code><code>doc.Close(</code><code>ref</code> <code>oMissing, </code><code>ref</code> <code>oMissing, </code><code>ref</code> <code>oMissing);</code>

<code>                    </code><code>System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);</code>

<code>                    </code><code>doc = </code><code>null</code><code>;</code>

<code>                </code><code>if</code> <code>(app != </code><code>null</code><code>)</code>

<code>                    </code><code>app.Quit(</code><code>ref</code> <code>oMissing, </code><code>ref</code> <code>oMissing, </code><code>ref</code> <code>oMissing);</code>

<code>                    </code><code>System.Runtime.InteropServices.Marshal.ReleaseComObject(app);</code>

<code>                    </code><code>app = </code><code>null</code><code>;</code>

<code>                    </code><code>GC.Collect();</code>

<code>        </code><code>/// 從模闆建立Word檔案</code>

<code>        </code><code>/// &lt;param name="fileName"&gt;模闆位置及名稱&lt;/param&gt;</code>

<code>        </code><code>public</code> <code>Document CreateWord(</code><code>string</code> <code>fileName, </code><code>string</code> <code>dsr)</code>

<code>                </code><code>app = </code><code>new</code> <code>Microsoft.Office.Interop.Word.Application();</code><code>//打開word程式</code>

<code>                </code><code>Document doc = </code><code>new</code> <code>Document();</code><code>//建立word對象</code>

<code>                </code><code>object</code> <code>unknow = Type.Missing;</code>

<code>                </code><code>string</code> <code>date = DateTime.Now.ToShortDateString();</code>

<code>                </code><code>object</code> <code>savefilename = </code><code>@"D:\"</code> <code>+ dsr + ".doc";</code><code>//儲存路徑</code>

<code>                </code><code>object</code> <code>File = fileName;</code>

<code>                </code><code>app.Visible = </code><code>false</code><code>;</code><code>//設定word程式為不可見</code>

<code>                </code><code>doc = app.Documents.Open(</code><code>ref</code> <code>File,</code>

<code>                </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow,</code>

<code>                </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow);</code><code>//打開word文檔</code>

<code>                </code><code>doc.SaveAs(</code><code>ref</code> <code>savefilename, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow, </code><code>ref</code> <code>unknow);</code><code>//儲存word文檔</code>

<code>                </code><code>return</code> <code>doc;</code>

<code>                </code><code>return</code> <code>null</code><code>;</code>

<code>    </code><code>}</code>

<code>}</code>

二、excel

webform中,導出excel的代碼:

<code>public</code> <code>void</code> <code>ExportResult(DataTable dt, </code><code>string</code> <code>excelName)</code>

<code>    </code><code>Response.Clear();</code>

<code>    </code><code>Response.Charset = </code><code>""</code><code>;</code>

<code>    </code><code>Response.ContentType = </code><code>"applicationnd.ms-xls"</code><code>;</code>

<code>    </code><code>StringWriter sw = </code><code>new</code> <code>StringWriter();</code>

<code>    </code><code>HtmlTextWriter htmlWrite = </code><code>new</code> <code>HtmlTextWriter(sw);</code>

<code>                    </code> 

<code>    </code><code>DataGrid dg = </code><code>new</code> <code>DataGrid();</code>

<code>    </code><code>dg.DataSource = dt;</code>

<code>    </code><code>dg.DataBind();</code>

<code>    </code><code>dg.RenderControl(htmlWrite);</code>

<code>    </code><code>Response.AddHeader(</code><code>"content-disposition"</code><code>, </code><code>"attachment;filename="</code> <code>+ HttpUtility.UrlEncode(excelName));</code>

<code>    </code><code>Response.Write(sw.ToString());</code>

<code>    </code><code>Response.End();</code>

如果遇到身份證等類型的字段,由于科學計數法的原因導出excel之後很可能會“截斷”,是以有必要對這種長整型的字段進行處理。

<code>/// &lt;summary&gt;</code>

<code>/// 過濾低位非列印字元</code>

<code>/// &lt;/summary&gt;</code>

<code>/// &lt;param name="tmp"&gt;&lt;/param&gt;</code>

<code>/// &lt;returns&gt;&lt;/returns&gt;</code>

<code>private</code> <code>string</code> <code>ReplaceLowOrderASCIICharacters(</code><code>string</code> <code>tmp)</code>

<code>    </code><code>StringBuilder info = </code><code>new</code> <code>StringBuilder();</code>

<code>    </code><code>foreach</code> <code>(</code><code>char</code> <code>cc </code><code>in</code> <code>tmp)</code>

<code>        </code><code>int</code> <code>ss = (</code><code>int</code><code>)cc;</code>

<code>        </code><code>if</code> <code>(((ss &gt;= 0) &amp;&amp; (ss &lt;= 8)) || ((ss &gt;= 11) &amp;&amp; (ss &lt;= 12)) || ((ss &gt;= 14) &amp;&amp; (ss &lt;= 32)))</code>

<code>            </code><code>info.AppendFormat(</code><code>" "</code><code>, ss);</code>

<code>        </code><code>else</code> <code>info.Append(cc);</code>

<code>    </code><code>return</code> <code>info.ToString();</code>

winform中,用戶端生成excel的代碼:

前提是要安裝office,原理是通過office程序生成excel檔案。

<code>/// 從DataSet生成Excel</code>

<code>/// &lt;param name="ds"&gt;DataSet&lt;/param&gt;</code>

<code>/// &lt;param name="strExcelFileName"&gt;檔案名&lt;/param&gt;</code>

<code>public</code> <code>void</code> <code>ExportExcelByDataSet(DataSet ds, </code><code>string</code> <code>strExcelFileName)</code>

<code>    </code><code>Microsoft.Office.Interop.Excel.Application excel = </code><code>new</code> <code>Microsoft.Office.Interop.Excel.Application();</code>

<code>           </code> 

<code>    </code><code>int</code> <code>rowIndex = 1;</code>

<code>    </code><code>int</code> <code>colIndex = 0;</code>

<code>    </code><code>excel.Application.Workbooks.Add(</code><code>true</code><code>);</code>

<code>    </code><code>DataTable dt = ds.Tables[0];</code>

<code>    </code><code>foreach</code> <code>(DataColumn col </code><code>in</code> <code>dt.Columns)</code>

<code>        </code><code>colIndex++;</code>

<code>        </code><code>excel.Cells[1, colIndex] = col.ColumnName;</code>

<code>    </code><code>foreach</code> <code>(DataRow row </code><code>in</code> <code>dt.Rows)</code>

<code>        </code><code>rowIndex++;</code>

<code>        </code><code>colIndex = 0;</code>

<code>        </code><code>foreach</code> <code>(DataColumn col </code><code>in</code> <code>dt.Columns)</code>

<code>            </code><code>colIndex++;</code>

<code>            </code><code>excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();</code>

<code>    </code><code>excel.Visible = </code><code>false</code><code>;</code>

<code>    </code><code>excel.ActiveWorkbook.SaveAs(strExcelFileName + </code><code>".XLS"</code><code>, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel9795, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>false</code><code>, </code><code>false</code><code>, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>, </code><code>null</code><code>);</code>

<code>    </code><code>excel.Quit();</code>

<code>    </code><code>excel = </code><code>null</code><code>;</code>

<code>    </code><code>GC.Collect();</code>

三、pdf

搜尋《PDF檔案制作全攻略》,可以找到現成的資料,裡面的代碼和文檔也相對比較齊全、清晰,這裡簡單做個示例demo——生成一個帶章節的,内容為圖檔的pdf文檔。

實作步驟:

1)在vs環境下建立項目,引用 ICSharpCode.SharpZipLib.dll、itextsharp.dll 這兩個dll檔案

2)在按鈕事件下輸入如下代碼:

<code>//設定版面為A4大小</code>

<code>Document document = </code><code>new</code> <code>Document(PageSize.A4);</code>

<code>       </code> 

<code>//建立一個test.pdf檔案</code>

<code>PdfWriter.getInstance(document, </code><code>new</code> <code>FileStream(</code><code>"test.pdf"</code><code>, FileMode.Create));</code>

<code>document.Open();</code><code>//打開pdf文檔</code>

<code>try</code>

<code>    </code><code>string</code><code>[] images = Directory.GetFiles(</code><code>"test/"</code><code>);</code>

<code>    </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; images.Length; i++)</code>

<code>        </code><code>//定義章節</code>

<code>        </code><code>Chapter chapter = </code><code>new</code> <code>Chapter(</code><code>new</code> <code>Paragraph(images[i]), i + 1);</code>

<code>        </code><code>//加入章節</code>

<code>        </code><code>document.Add(chapter);</code>

<code>        </code><code>//獲得圖檔</code>

<code>        </code><code>iTextSharp.text.Image tempImage = iTextSharp.text.Image.getInstance(images[i]);</code>

<code>        </code><code>//設定圖檔大小為原圖的70%</code>

<code>        </code><code>tempImage.scalePercent(70);</code>

<code>        </code><code>//文檔加入圖檔</code>

<code>        </code><code>document.Add(tempImage);</code>

<code>        </code><code>//文檔建立一頁</code>

<code>        </code><code>document.newPage();</code>

<code>catch</code> <code>(Exception ex)</code>

<code>    </code><code>throw</code> <code>ex;</code>

<code>document.Close();</code><code>//關閉pdf文檔</code>

本文轉自 guwei4037  51CTO部落格,原文連結:http://blog.51cto.com/csharper/1345979