之是以特地弄一篇這個博文,是因為最近項目中引用了office導出excel的dll,之前一直導出沒有問題,結果最近老是報這個錯。

1、Office的競争對手WPS或者是360等“流氓軟體”所為。
2、是否是某個系統更新安裝了導緻了這個錯誤。
後來第二天上班,我特地按照解除安裝WPS、重裝office的步驟做了試驗,中間每一步都有重新開機電腦。結果折騰了半個多小時還是不行,還是報一模一樣的錯。
後來索性用了一個第三方元件NPOI來導出datagridview的資料到excel檔案。
代碼如下:
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
<code>public</code> <code>void</code> <code>ExportExcel(</code><code>string</code> <code>fileName, DataGridView dgv)</code>
<code>{</code>
<code> </code><code>string</code> <code>saveFileName = </code><code>""</code><code>;</code>
<code> </code><code>SaveFileDialog saveDialog = </code><code>new</code> <code>SaveFileDialog();</code>
<code> </code><code>saveDialog.DefaultExt = </code><code>"xls"</code><code>;</code>
<code> </code><code>saveDialog.Filter = </code><code>"Excel檔案|*.xls"</code><code>;</code>
<code> </code><code>saveDialog.FileName = fileName;</code>
<code> </code><code>saveDialog.ShowDialog();</code>
<code> </code><code>saveFileName = saveDialog.FileName;</code>
<code> </code>
<code> </code><code>HSSFWorkbook workbook = </code><code>new</code> <code>HSSFWorkbook();</code>
<code> </code><code>MemoryStream ms = </code><code>new</code> <code>MemoryStream();</code>
<code> </code><code>NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet(</code><code>"Sheet1"</code><code>);</code>
<code> </code><code>int</code> <code>rowCount = dgv.Rows.Count;</code>
<code> </code><code>int</code> <code>colCount = dgv.Columns.Count;</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i < rowCount; i++)</code>
<code> </code><code>{</code>
<code> </code><code>NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>j = 0; j < colCount; j++)</code>
<code> </code><code>{</code>
<code> </code><code>if</code> <code>(dgv.Columns[j].Visible && dgv.Rows[i].Cells[j].Value != </code><code>null</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j);</code>
<code> </code><code>cell.SetCellValue(dgv.Rows[i].Cells[j].Value.ToString());</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>workbook.Write(ms);</code>
<code> </code><code>FileStream file = </code><code>new</code> <code>FileStream(saveFileName, FileMode.Create);</code>
<code> </code><code>workbook.Write(file);</code>
<code> </code><code>file.Close();</code>
<code> </code><code>workbook = </code><code>null</code><code>;</code>
<code> </code><code>ms.Close();</code>
<code> </code><code>ms.Dispose();</code>
<code> </code><code>MessageBox.Show(fileName + </code><code>" 儲存成功"</code><code>, </code><code>"提示"</code><code>, MessageBoxButtons.OK);</code>
<code>}</code>
後來用了這個方法後成功的導出了excel,而且速度似乎還比以前調用office元件的方式要快一點。
本文轉自 guwei4037 51CTO部落格,原文連結:http://blog.51cto.com/csharper/1345976