對於用com組件寫excel,筆者表示那個太慢了。而且很耗資源,還要裝excel。
今天我們就用寫文本文件的方式來寫excel。
步驟1,用excel寫好一個設計一個我們想要的模板。
步驟2,我們把做好的excel模板,另存為。 這時會出現另存為的對話框。在保存類型中選擇“XML 電子表格 2003 (*.xml)”。然后名字隨便寫。
步驟3,把我們剛保存的xml文件用文本打開。我們就會看到,其實excel是以xml方式存放的數據。如果這時你用excel打開那個xml文件,會發現excel出現的就是我們剛才的設計的模板。而且格式和我們設計的一樣。
步驟4,所以我們可以用寫xml,或者文本的方式寫excel,只要符合我們剛才保存的那個xml格式。然后文件的后綴名改成xls就OK了。 而這個寫的速度超快。
說完了上面的方法我們用代碼把它實現吧。筆者主要編程語言為c#。所以就用c#封裝了個寫excel的類。代碼如下
public class ExcelHelper { private Excel.Application oExcel = null; private Excel.Workbook oBook = null; private Excel.Worksheet oSheet = null; private Excel.Range oRange = null; public ExcelHelper() { oExcel = new Excel.Application(); oBook = oExcel.Application.Workbooks.Add(true); oSheet = (Excel.Worksheet)oBook.ActiveSheet; } /// <summary> /// 向excel寫入文本(如向“A1”寫入文字:InsertText("A1",要填入的文字)) /// </summary> /// <param name="val_range">單元格</param> /// <param name="val_text">文本</param> public void InsertText(string val_range, string val_text) { oRange = oSheet.Range[val_range]; oRange.Value = val_text; } /// <summary> /// 向excel寫入文本 /// </summary> /// <param name="val_range">單元格</param> /// <param name="val_text">文本</param> /// <param name="val_fontSize">字體大小</param> public void InsertText(string val_range, string val_text, float val_fontSize) { oRange = oSheet.Range[val_range]; oRange.Value = val_text; oRange.Font.Size = val_fontSize; } /// <summary> /// 向excel寫入文本(如向“B1”寫入文字:InsertText(1,2,要填入的文字)) /// </summary> /// <param name="val_i">行號</param> /// <param name="val_j">列號</param> /// <param name="val_text">文本</param> public void InsertText(int val_i, int val_j, string val_text) { oRange = (Excel.Range)oSheet.Cells[val_i, val_j]; oRange.Value = val_text; } /// <summary> /// 向excel寫入文本(如向“B1”寫入文字:InsertText(1,2,要填入的文字,字體大小)) /// </summary> /// <param name="val_i">行號</param> /// <param name="val_j">列號</param> /// <param name="val_text">文本</param> /// <param name="val_fontSize">字體大小</param> public void InsertText(int val_i, int val_j, string val_text, float val_fontSize) { oRange = oSheet.Cells[val_i, val_j]; oRange.Value = val_text; oRange.Font.Size = val_fontSize; } /// <summary> /// 讀取excel文本項(如讀取“B1”的文字:ReadText("B1")) /// </summary> /// <param name="val_range">單元格</param> /// <returns></returns> public string ReadText(string val_range) { oRange = oSheet.Range[val_range]; return oRange.Text.ToString(); } /// <summary> /// 讀取excel文本項(如讀取“A1”的文字:ReadText(1,1)) /// </summary> /// <param name="val_i">行號</param> /// <param name="val_j">列號</param> /// <returns></returns> public string ReadText(int val_i, int val_j) { oRange = oSheet.Cells[val_i, val_j]; return oRange.Text.ToString(); } /// <summary> /// 合並單元格 /// </summary> /// <param name="x1">行號</param> /// <param name="y1">列號</param> /// <param name="x2">行號</param> /// <param name="y2">列號</param> public void MerMergeCells(int x1, int y1, int x2, int y2) { oSheet.Range[oSheet.Cells[x1, y1], oSheet.Cells[x2, y2]].Merge(); } /// <summary> /// 設置excel列的默認樣式 /// </summary> public void SetColumnDefaultStyle() { oSheet.Columns.EntireColumn.AutoFit(); oSheet.Columns.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; } /// <summary> /// 保存excel文件(如要將excel保存到D:\test.xls:SaveAs) /// </summary> /// <param name="val_saveAsFilePath">文件路徑</param> /// <returns></returns> public bool SaveAs(string val_saveAsFilePath) { try { oSheet.SaveAs(val_saveAsFilePath); return true; } catch { return false; } } public bool Print() { try { oSheet.PrintOut(); return true; } catch { return false; } } /// <summary> /// 自動釋放excel資源 /// </summary> public void Dispose() { if (oExcel != null) { oExcel.Workbooks.Close(); oExcel.Quit(); KillAllExcel(); oExcel = null; } if (oBook != null) { oBook = null; } if (oSheet != null) { oSheet = null; } if (oRange != null) { oRange = null; } GC.Collect(); } /// <summary> /// 獲取所有excel進程 /// </summary> /// <returns></returns> private static List<Process> GetExcelProcesses() { Process[] processes = Process.GetProcesses(); List<Process> excelProcesses = new List<Process>(); for (int i = 0; i < processes.Length; i++) { if (processes[i].ProcessName.ToUpper() == "EXCEL") excelProcesses.Add(processes[i]); } return excelProcesses; } /// <summary> /// 殺死所有Excel進程 /// </summary> private static void KillAllExcel() { List<Process> excelProcesses = GetExcelProcesses(); for (int i = 0; i < excelProcesses.Count; i++) { excelProcesses[i].Kill(); } } /// <summary> /// DataTable導出Excel /// </summary> /// <param name="sFileName"></param> /// <param name="dt"></param> public void DataTableToExcel(string fileName, DataTable dt) { int CurrentCol = 0;//當前列 int RowCount = dt.Rows.Count + 1;//總行數 int ColCount = dt.Columns.Count;//總列數 StreamWriter sw = new StreamWriter(fileName, false);//文件如果存在,則自動覆蓋 try { #region XML頭部 sw.WriteLine("<?xml version=\"1.0\"?>"); sw.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>"); sw.WriteLine("<Workbook"); sw.WriteLine("xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\""); sw.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">"); sw.WriteLine("\t<Styles>"); sw.WriteLine("\t\t<Style ss:ID=\"Default\" ss:Name=\"Normal\"><Alignment ss:Vertical=\"Center\"/><Font ss:FontName=\"宋體\" ss:Size=\"12\"/></Style>"); sw.WriteLine("\t\t<Style ss:ID=\"s47\"><Font ss:FontName=\"宋體\" ss:Size=\"11\" ss:Color=\"#000000\"/><Interior ss:Color=\"#EBF1DE\" ss:Pattern=\"Solid\"/></Style>"); sw.WriteLine("\t\t<Style ss:ID=\"s33\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/></Borders><Font ss:FontName=\"宋體\" ss:Size=\"11\" ss:Color=\"#FFFFFF\" ss:Bold=\"1\"/><Interior ss:Color=\"#A5A5A5\" ss:Pattern=\"Solid\"/></Style>"); sw.WriteLine("\t\t<Style ss:ID=\"s68\" ss:Parent=\"s33\"><Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\"/></Style>"); sw.WriteLine("\t\t<Style ss:ID=\"s93\" ss:Parent=\"s47\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/></Borders></Style>"); sw.WriteLine("\t</Styles>"); sw.WriteLine("\t<Worksheet ss:Name=\"Sheet1\">"); sw.WriteLine("\t\t<Table ss:DefaultColumnWidth=\"150\" ss:DefaultRowHeight=\"20\">"); #endregion #region excel標題 sw.WriteLine("\t\t\t<Row>"); sw.WriteLine("\t\t\t\t<Cell ss:MergeAcross=\"{0}\" ss:StyleID=\"s68\">",ColCount-1); sw.WriteLine("\t\t\t\t\t<Data ss:Type=\"String\">{0}</Data>",dt.TableName); sw.WriteLine("\t\t\t\t</Cell>"); sw.WriteLine("\t\t\t</Row>"); #endregion #region excel表頭信息 sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">"); for (CurrentCol = 0; CurrentCol < ColCount; CurrentCol++) { sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">{0}</Data></Cell>", dt.Columns[CurrentCol].ColumnName.ToString().Trim()); } sw.WriteLine("\t\t\t</Row>"); #endregion #region excel表格內容 foreach (DataRow row in dt.Rows) { sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">"); for (CurrentCol = 0; CurrentCol < ColCount; CurrentCol++) { sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">"); if (row[CurrentCol] != null) { sw.Write(row[CurrentCol].ToString().Trim()); } else { sw.Write(""); } sw.Write("</Data></Cell>"); } sw.WriteLine("\t\t\t</Row>"); } #endregion #region XML尾部 sw.WriteLine("\t\t</Table>"); sw.WriteLine("\t</Worksheet>"); sw.WriteLine("</Workbook>"); #endregion } catch { } finally { sw.Close(); sw = null; } } }
