一、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>/// <summary></code>
<code> </code><code>/// 從Excel中讀取資料</code>
<code> </code><code>/// </summary></code>
<code> </code><code>/// <param name="excelPath"></param></code>
<code> </code><code>/// <param name="sheetName"></param></code>
<code> </code><code>/// <returns></returns></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>/// <param name="doc">文檔</param></code>
<code> </code><code>/// <param name="args">要替換的内容</param></code>
<code> </code><code>public</code> <code>void</code> <code>ReplaceWord(Document doc, Dictionary<</code><code>string</code><code>, </code><code>string</code><code>> 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>/// <param name="doc">要釋放資源的文檔</param></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>/// <param name="fileName">模闆位置及名稱</param></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>/// <summary></code>
<code>/// 過濾低位非列印字元</code>
<code>/// </summary></code>
<code>/// <param name="tmp"></param></code>
<code>/// <returns></returns></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 >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 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>/// <param name="ds">DataSet</param></code>
<code>/// <param name="strExcelFileName">檔案名</param></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 < 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