.NET 操作 Excel 主要有三種路徑:ADO.NET (適合純資料讀寫)、Microsoft.Office.Interop.Excel (功能最完整、需安裝 Office)、OpenXML/EPPlus (無需 Office、效能佳)。本文以 ADO.NET 讀取與 Interop 建立/寫入/格式化為主,提供實用範本。
public DataTable ExcelToDataTable(string strExcelPath, string strSheetName)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + strExcelPath + ";" +
"Extended Properties=Excel 5.0;";
string strExcel = string.Format("SELECT * FROM [{0}$]", strSheetName);
DataSet ds = new DataSet();
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);
// 注意:原始碼中 conn.Close() 但 conn 未定義,應改為 adapter.Dispose() 或連線物件管理
return ds.Tables[strSheetName];
}
參數說明:
strExcelPath - Excel 檔案完整路徑
strSheetName - 工作表名稱 (不含 $ 符號)
Excel.Application excelApp = new Excel.Application();
Excel.Workbook wb = excelApp.Workbooks.Open("Excel檔案路徑", 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true);
Excel.Sheets sheets = wb.Worksheets;
Excel.Worksheet ws = (Excel.Worksheet)sheets.get_Item(1);
string sheetName = ws.Name;
wb.Close(null, null, null);
excelApp.Quit(); // 必須釋放,否則 Excel 進程殘留
Excel.ApplicationClass excel = new Excel.ApplicationClass();
Excel._Workbook wb;
Excel._Worksheet ws;
wb = excel.Workbooks.Add(true);
object missing = System.Reflection.Missing.Value;
excel.Sheets.Add(missing, missing, 1, Excel.XlSheetType.xlWorksheet);
ws = (Excel._Worksheet)wb.ActiveSheet;
ws.Name = "新的表";
wb.SaveAs("儲存路徑", missing, missing, missing, missing, missing,
Excel.XlSaveAsAccessMode.xlShared, missing, missing, missing, missing);
excel.Quit();
| 格式類型 | NumberFormat 字串 |
|---|---|
| 文字 | @ |
| 日期 | yyyy/mm/dd |
| 數字 (兩位小數) | #,##0.00 |
| 貨幣 | ¥#,##0.00 |
| 百分比 | 0.00% |
// 設定第一列字體紅色
((Excel.Range)ws.Rows[1, Type.Missing]).Font.Color = 0xFF0000;
// 設定第二欄為百分比格式
((Excel.Range)ws.Columns[2, Type.Missing]).NumberFormat = "0.00%";
// 選取範圍:第 1 列第 2 欄 到 第 1 列第 5 欄
Excel.Range rng = ws.get_Range(ws.Cells[1, 2], ws.Cells[1, 5]);
// 寫入資料 (列從 1 開始,欄從 1 開始)
int rowIdx = 2; // 從第 2 列開始 (第 1 列為標題)
foreach (DataRow dr in dt.Rows)
{
int colIdx = 1;
ws.Cells[rowIdx, colIdx++] = dr["欄位1"].ToString();
ws.Cells[rowIdx, colIdx++] = dr["欄位2"].ToString();
ws.Cells[rowIdx, colIdx++] = dr["欄位3"].ToString();
ws.Cells[rowIdx, colIdx++] = dr["欄位4"].ToString();
ws.Cells[rowIdx, colIdx++] = dr["欄位5"].ToString();
ws.Cells[rowIdx, colIdx++] = dr["欄位6"].ToString();
// 使用公式:A+B+C+D 的加總
ws.Cells[rowIdx, colIdx++] = string.Format("=SUM(A{0}:D{0})", rowIdx);
rowIdx++;
}
wb.Save();
wb.Close();
excel.Quit();
Quit() 並搭配 Marshal.ReleaseComObject,避免 Excel 進程殘留佔用記憶體。Microsoft.Jet.OLEDB.4.0 + Excel 8.0;.xlsx 使用 Microsoft.ACE.OLEDB.12.0 + Excel 12.0。