Excel操作資料1

2021-06-01 18:06:27 字數 3702 閱讀 4389

生成excel的方法為呼叫本地office com元件,操作excel。新建專案後,新增對應office版本的microsoft.office.interop.excel

的引用,如圖

1-1所示。

新增microsoft.office.interop.excel引用

為方便起見,這裡以乙個示例程式說明我的過程。示例程式整體結構如**清單1-1所示。

**清單1-1 示例程式結構

usingsystem;

usingsystem.collections.generic;

usingsystem.linq;

usingsystem.text;

usingexcel=microsoft.office.interop.excel;

namespaceexcel

publicvoidcreateexcel()

publicvoidadddata(introw, intcol, stringdata, stringformat

,string cell1

,string cell2)

publicvoidexport()

} }

首先我先宣告了四個字段,分別解釋如下:

2)excel.workbook workbook。excel.workbook類表示excel應用程式中的單個工作簿。

3)excel.worksheet worksheet。excel提供sheets集合作為 microsoft.office.interop.excel.workbook 物件的屬性,但是excel中沒有sheet類。相反,sheets 集合的每個成員都是乙個microsoft.office.interop.excel.worksheet物件,或者是乙個 microsoft.office.interop.excel.chart物件。

4)excel.range worksheet_range。excel.range物件是excel應用程式中最常用的物件。在能夠處理excel內的任何範圍之前,必須將它表示為range物件,並處理該物件的方法和屬性。range物件表示乙個單元格、一行、一列、包含乙個或多個單元格塊(可以連續,也可以不連續)的單元格選定範圍,甚至多個工作表中的一組單元格。

createexcel()方法用來建立excel例項,也就是初始化宣告的四個變數,實現**如**清單1-2所示。

**清單1-2 初始化變數

publicvoidcreateexcel()

adddata()方法用來向**中新增資料,四個引數分別為行、列、資料、資料格式,範圍起始格、範圍結束格。實現**如**清單1-3所示。

**清單1-3 新增資料

worksheet.cells[row, col] = data;

worksheet_range = worksheet.get_range(cell1, cell2);

worksheet_range.borders.color = system.drawing.color.black.toargb();

worksheet_range.numberformat = format;

excel中的每乙個格以行和列組成的座標來唯一標識,這裡行標識是數字,從1到n;列標識是字母,從a到z,從aa到az……。

worksheet_range物件由worksheet.get_range(cell1, cell2)方法來初始化,從cell1到cell2會被作為乙個整體處理。worksheet_range.numberformat設定該區域內的字元格式化方式。

export()方法用來匯出生成的excel,實現如**清單1-4所示。

**清單1-4 匯出excel

publicvoidexport()

在本地測試一切正常,測試結果如圖1-2所示。

測試結果

合併單元格的時候,必須要傳遞以字母表示的列標識給excel.range物件的

.merge

(int

)方法,但是我們取資料和填充資料使用的都是數字標識,這時候必須轉成如圖

1-3的形式。

的字母列標識

**清單1-5提供的演算法可解決這個問題。

**清單1-5 數字列標識轉字母列標識

public string toname(int index)

while (index > 0);

return string.join(string.empty, chars.toarray()); }

一不小心就會出"異常來自 hresult:0x800a03ec "的異常,原因很簡單,excel的行列都是從1開始的,如果我們習慣性的給worksheet.cells[0, 0]或者worksheet.cells[1, 0]或者worksheet.cells[0, 1]賦值,就會引發該異常。

客戶端一切執行正常,接下來就是要把dll部署到伺服器上。可是伺服器根本沒用安裝office,在**找了很久,也沒找到此種方法的解決方案。無奈就安裝了office,本來以為萬事大吉,但是每次都提示"未將物件引用設定到物件例項"。採用拋異常的方法才知道示例程式中的幾個主要欄位都為空,那就是本地的com根本沒呼叫成功。找到文章,於是乎又進行了如下操作。

從伺服器上把excel.exe拷到了本機上,然後從vs2010的命令列啟動tlbimp

,執行命令:

tlbimp /out:interop.excel.dll excel.exe

。生成interop.excel.dll

。在專案中去除了microsoft.office.interop.excel.dll的引用,新增interop.excel.dll

,將頂部的

using excel=microsoft.office.interop.excel

,該為using excel= interop.excel

,本地執行程式沒有問題。再次更新伺服器端程式,結果又出了新的異常:

檢索 com 類工廠中 clsid 為 的元件時失敗,原因是出現以下錯誤:80080005

"80080005異常"是應用程式對com元件操作許可權不足引起的。於是有了下面的操作:

1)控制面板->管理工具->元件服務->計算機->我的電腦->dcom-> microsoft excel 應用程式

2)單擊屬性開啟此應用程式的屬性對話方塊。

3) 單擊標識選項卡,然後選擇互動式使用者。

4) 單擊預設安全性選項卡。設定當前伺服器與asp.net相關的使用者的訪問許可權。

至此,程式才執行成功,可謂一波三折。

如果使用這種方式使用者每匯出乙個excel檔案,伺服器端就會啟動乙個excel程序。這回引起兩個問題,一是耗費伺服器資源,二是當程序數達到上限時,會引發異常,呼叫com失敗。這個時候要想辦法結束excel程序。我採用了殺程序的方式,類似下面的做法:

生成excel方式不止一種,比如利用openxml,還是留給你們導論吧,我向你們學習。

MySQL基本操作 資料操作

刪除資料 更新字段 1.插入指定字段值 insert into 表名 字段列表 values 對應字段值列表 2.向表中所有字段插入資料 insert into 表名 values 按表結構寫對應資料 insert into my teacher values liwei 20 1.查詢表中全部資料...

Python資料操作 資料清理

資料丟失在現實生活中是乙個問題。機器學習和資料探勘等領域由於資料缺失導致資料質量差,因此在模型 的準確性方面面臨嚴峻的問題。在這些領域,缺失值處理是使模型更加準確和有效的關鍵。現在來看看如何使用pandas庫處理缺失值 如na或nan 使用pandas庫處理資料中的缺失值 import pandas...

oracle 誤操作 資料 恢復

drop 等誤操作 恢復 站內資料 show recyclebin flashback table table name to before drop 未commit誤操作 rollback 已commit delete等誤刪除資料恢復 檢視當前scn,scn 1就是上一次commit操作 sele...