項目中經常使用到將數據導入Excel,將Excel中的數據導入數據庫的功能,曾經也查找過相關的內容,將曾經用過的方案總結一下。html
NPOIweb
NPOI 是 POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。
使用 NPOI 你就能夠在沒有安裝 Office 或者相應環境的機器上對 WORD/EXCEL 文檔進行讀寫。NPOI是構建在POI 3.x版本之上的,它能夠在沒有安裝Office的狀況下對Word/Excel文檔進行讀寫操做。數據庫
優點服務器
(一)傳統操做Excel遇到的問題:
一、若是是.NET,須要在服務器端裝Office,且及時更新它,以防漏洞,還須要設定權限容許.NET訪問COM+,若是在導出過程當中出問題可能致使服務器宕機。
二、Excel會把只包含數字的列進行類型轉換,原本是文本型的,Excel會將其轉成數值型的,好比編號000123會變成123。
三、導出時,若是字段內容以「-」或「=」開頭,Excel會把它當成公式進行,會報錯。
四、Excel會根據Excel文件前8行分析數據類型,若是正好你前8行某一列只是數字,那它會認爲該列爲數值型,自動將該列轉變成相似1.42702E+17格式,日期列變成包含日期和數字的。
(二)使用NPOI的優點
一、您能夠徹底無償使用該框架
二、包含了大部分EXCEL的特性(單元格樣式、數據格式、公式等等)
三、專業的技術支持服務(24*7全天候) (非免費)
四、支持處理的文件格式包括xls, xlsx, docx.
五、採用面向接口的設計架構( 能夠查看 NPOI.SS 的命名空間)
六、同時支持文件的導入和導出
七、基於.net 2.0 也支持xlsx 和 docx格式(固然也支持.net 4.0)
八、來自全世界大量成功且真實的測試Cases
九、大量的實例代碼
十一、你不須要在服務器上安裝微軟的Office,能夠避免版權問題。
十二、使用起來比Office PIA的API更加方便,更人性化。
1三、你不用去花大力氣維護NPOI,NPOI Team會不斷更新、改善NPOI,絕對省成本。
NPOI之因此強大,並非由於它支持導出Excel,而是由於它支持導入Excel,並能「理解」OLE2文檔結構,這也是其餘一些Excel讀寫庫比較弱的方面。一般,讀入並理解結構遠比導出來得複雜,由於導入你必須假設一切狀況都是可能的,而生成你只要保證知足你本身需求就能夠了,若是把導入需求和生成需求比作兩個集合,那麼生成需求一般都是導入需求的子集,這一規律不只體如今Excel讀寫庫中,也體如今pdf讀寫庫中,目前市面上大部分的pdf庫僅支持生成,不支持導入。架構
構成app
NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分組成。框架
NPOI.POIFS
|
OLE2/ActiveX文檔屬性讀寫庫
|
NPOI.DDF
|
Microsoft Office Drawing讀寫庫
|
NPOI.HPSF
|
OLE2/ActiveX文檔讀寫庫
|
NPOI.HSSF
|
Microsoft Excel BIFF(Excel 97-2003)格式讀寫庫
|
NPOI.SS
|
Excel公用接口及Excel公式計算引擎
|
NPOI.Util
|
基礎類庫,提供了不少實用功能,可用於其餘讀寫文件格式項目的開發
|
Assembly名稱 | 模塊/命名空間 | 說明 |
NPOI.DLL |
NPOI.POIFS
|
OLE2/ActiveX文檔屬性讀寫庫
|
NPOI.DLL |
NPOI.DDF
|
微軟Office Drawing讀寫庫
|
NPOI.DLL |
NPOI.HPSF
|
OLE2/ActiveX文檔讀寫庫
|
NPOI.DLL |
NPOI.HSSF
|
微軟Excel BIFF(Excel 97-2003, doc)格式讀寫庫
|
NPOI.DLL |
NPOI.SS
|
Excel公用接口及Excel公式計算引擎
|
NPOI.DLL |
NPOI.Util
|
基礎類庫,提供了不少實用功能,可用於其餘讀寫文件格式項目的開發
|
NPOI.OOXML.DLL | NPOI.XSSF | Excel 2007(xlsx)格式讀寫庫 |
NPOI.OOXML.DLL | NPOI.XWPF | Word 2007(docx)格式讀寫庫 |
NPOI.OpenXml4Net.DLL | NPOI.OpenXml4Net | OpenXml底層zip包讀寫庫 |
NPOI.OpenXmlFormats.DLL | NPOI.OpenXmlFormats | 微軟Office OpenXml對象關係庫 |
(以上內容來自百度百科)從上表可知NPOI組件已支持excel2007,記得以前用的時候只支持excel2003。好久沒研究過這玩意兒了。ide
案例函數
官網地址:http://npoi.codeplex.com/,能夠從官網下載NPOI2.X版本的。測試
首先引入
ICSharpCode.SharpZipLib.dll
NPOI.dll
NPOI.OOXML.dll
NPOI.OpenXml4Net.dll
NPOI.OpenXmlFormats.dll
而後引入命名空間:
using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel;
輔助類
using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using NPOI.SS.Formula.Eval; namespace Wolfy.Common { /// <summary> /// 使用NPOI組件 /// 需引入ICSharpCode.SharpZipLib.dll/NPOI.dll/NPOI.OOXML.dll/NPOI.OpenXml4Net.dll/NPOI.OpenXmlFormats.dll /// office2007 /// </summary> public class NPOIExcelHelper { /// <summary> /// 將Excel文件中的數據讀出到DataTable中 /// </summary> /// <param name="file"></param> /// <returns></returns> public static DataTable Excel2DataTable(string file, string sheetName, string tableName) { DataTable dt = new DataTable(); IWorkbook workbook = null; using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { //office2003 HSSFWorkbook workbook = new XSSFWorkbook(fs); } ISheet sheet = workbook.GetSheet(sheetName); dt = Export2DataTable(sheet, 0, true); return dt; } /// <summary> /// 將指定sheet中的數據導入到datatable中 /// </summary> /// <param name="sheet">指定須要導出的sheet</param> /// <param name="HeaderRowIndex">列頭所在的行號,-1沒有列頭</param> /// <param name="needHeader"></param> /// <returns></returns> private static DataTable Export2DataTable(ISheet sheet, int HeaderRowIndex, bool needHeader) { DataTable dt = new DataTable(); XSSFRow headerRow = null; int cellCount; try { if (HeaderRowIndex < 0 || !needHeader) { headerRow = sheet.GetRow(0) as XSSFRow; cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i <= cellCount; i++) { DataColumn column = new DataColumn(Convert.ToString(i)); dt.Columns.Add(column); } } else { headerRow = sheet.GetRow(HeaderRowIndex) as XSSFRow; cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i <= cellCount; i++) { ICell cell = headerRow.GetCell(i); if (cell == null) { break;//到最後 跳出循環 } else { DataColumn column = new DataColumn(headerRow.GetCell(i).ToString()); dt.Columns.Add(column); } } } int rowCount = sheet.LastRowNum; for (int i = HeaderRowIndex + 1; i <= sheet.LastRowNum; i++) { XSSFRow row = null; if (sheet.GetRow(i) == null) { row = sheet.CreateRow(i) as XSSFRow; } else { row = sheet.GetRow(i) as XSSFRow; } DataRow dtRow = dt.NewRow(); for (int j = row.FirstCellNum; j <= cellCount; j++) { if (row.GetCell(j) != null) { switch (row.GetCell(j).CellType) { case CellType.Boolean: dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue); break; case CellType.Error: dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue); break; case CellType.Formula: switch (row.GetCell(j).CachedFormulaResultType) { case CellType.Boolean: dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue); break; case CellType.Error: dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue); break; case CellType.Numeric: dtRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue); break; case CellType.String: string strFORMULA = row.GetCell(j).StringCellValue; if (strFORMULA != null && strFORMULA.Length > 0) { dtRow[j] = strFORMULA.ToString(); } else { dtRow[j] = null; } break; default: dtRow[j] = ""; break; } break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(row.GetCell(j))) { dtRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue); } else { dtRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue); } break; case CellType.String: string str = row.GetCell(j).StringCellValue; if (!string.IsNullOrEmpty(str)) { dtRow[j] = Convert.ToString(str); } else { dtRow[j] = null; } break; default: dtRow[j] = ""; break; } } } dt.Rows.Add(dtRow); } } catch (Exception) { return null; } return dt; } /// <summary> /// 將DataTable中的數據導入Excel文件中 /// </summary> /// <param name="dt"></param> /// <param name="file"></param> public static void DataTable2Excel(DataTable dt, string file, string sheetName) { IWorkbook workbook = new XSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); IRow header = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = header.CreateCell(i); cell.SetCellValue(dt.Columns[i].ColumnName); } //數據 for (int i = 0; i < dt.Rows.Count; i++) { IRow row = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { ICell cell = row.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); } } MemoryStream stream = new MemoryStream(); workbook.Write(stream); byte[] buffer = stream.ToArray(); using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { fs.Write(buffer, 0, buffer.Length); fs.Flush(); } } /// <summary> /// 獲取單元格類型 /// </summary> /// <param name="cell"></param> /// <returns></returns> private static object GetValueType(XSSFCell cell) { if (cell == null) { return null; } switch (cell.CellType) { case CellType.Blank: return null; case CellType.Boolean: return cell.BooleanCellValue; case CellType.Error: return cell.ErrorCellValue; case CellType.Numeric: return cell.NumericCellValue; case CellType.String: return cell.StringCellValue; case CellType.Formula: default: return "=" + cell.StringCellValue; } } } }
參考:http://www.cnblogs.com/Joetao/articles/3247909.html
測試結果
導入Excel,student.xlsx
導入DataTable,這裏只將數據導入DataTable,導入數據庫部分,就再也不寫了。
測試數據,向qq羣裏一朋友要的。大概有5w多條,lz機子是老爺機跑不起,只導出了其中的1k條。
利用office的com組件
首先添加com引用
引入命名空間
using Excel = Microsoft.Office.Interop.Excel;
Com操做Excel輔助類
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Excel = Microsoft.Office.Interop.Excel; using System.Web.UI; using System.Web; using System.Data; namespace Wolfy.Common { /// <summary> /// 使用com組件 操做Excel /// </summary> public class ComExcelHelper { private Excel.Application appExcel = null; private Excel.Workbook workbook = null; private Excel.Worksheet sheet = null; private DateTime dtBefore; private DateTime dtAfter; private string filePath; public string FilePath { get { return filePath; } set { filePath = value; } } private string timestamp; /// <summary> /// 以時間字符串做爲保存文件的名稱 /// </summary> public string Timestamp { get { return timestamp; } set { timestamp = value; } } private object mValue = System.Reflection.Missing.Value; /// <summary> ///是否打開Excel界面 /// </summary> public bool Visible { set { appExcel.Visible = value; } } public ComExcelHelper() { this.dtBefore = DateTime.Now; appExcel = new Excel.Application(); this.dtAfter = DateTime.Now; this.timestamp = DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString(); } public ComExcelHelper(string strFilePath) { this.dtBefore = DateTime.Now; appExcel = new Excel.Application(); this.dtAfter = DateTime.Now; this.workbook = (Excel.Workbook)appExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue); this.timestamp = DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.ToShortDateString().Replace("-", "") + DateTime.Now.Second.ToString() + DateTime.Now.Millisecond.ToString(); } public void Dispose() { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); sheet = null; workbook.Close(false, mValue, mValue); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); workbook = null; appExcel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel); appExcel = null; GC.Collect(); GC.WaitForPendingFinalizers(); } catch (Exception ex) { throw ex; } finally { foreach (System.Diagnostics.Process pro in System.Diagnostics.Process.GetProcessesByName("Excel")) { if (pro.StartTime > this.dtBefore && pro.StartTime < this.dtAfter) { pro.Kill(); } } } System.GC.SuppressFinalize(this); } /// <summary> /// 加載Excel /// </summary> public void Load() { if (workbook == null && this.filePath != null) { workbook = appExcel.Workbooks.Open(this.filePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue); } } /// <summary> /// 加載Excel /// </summary> public void Load(string strFilePath) { if (workbook == null) { workbook = appExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue); } } /// <summary> /// 新建工做表 /// </summary> /// <param name="sheetName"></param> public void NewWorkSheet(string sheetName) { sheet = workbook.Sheets.Add(workbook.Sheets[1], mValue, mValue, mValue); sheet.Name = sheetName; } /// <summary> /// 在指定的單元格插入指定的值 /// </summary> /// <param name="strCell">單元格 如"A4"</param> /// <param name="objValue">文本 數字等值</param> public void WriteCell(string strCell, object objValue) { sheet.get_Range(strCell, mValue).Value2 = objValue; } /// <summary> /// 在指定Range中插入指定的值 /// </summary> /// <param name="strStartCell">Range的開始單元格</param> /// <param name="strEndCell">Range的結束單元格</param> /// <param name="objValue">文本、數字等值</param> public void WriteRange(string strStartCell, string strEndCell, object objValue) { sheet.get_Range(strStartCell, strEndCell).Value2 = objValue; } /**/ /// <summary> /// 合併單元格,並在合併後的單元格中插入指定的值 /// </summary> /// <param name="strStartCell"></param> /// <param name="strEndCell"></param> /// <param name="objValue"></param> public void WriteAfterMerge(string strStartCell, string strEndCell, object objValue) { sheet.get_Range(strStartCell, strEndCell).Merge(mValue); sheet.get_Range(strStartCell, mValue).Value2 = objValue; } /**/ /// <summary> /// 在連續單元格中插入一個DataTable中的值 /// </summary> /// <param name="strStartCell">開始的單元格</param> /// <param name="dtData">存儲數據的DataTable</param> public void WriteTable(string strStartCell, System.Data.DataTable dtData) { object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count]; for (int i = 0; i < dtData.Rows.Count; i++) for (int j = 0; j < dtData.Columns.Count; j++) arrData[i, j] = dtData.Rows[i][j]; sheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 1)).Value2 = arrData; arrData = null; } /**/ /// <summary> /// 在連續單元格中插入一個DataTable並做超級連接 /// </summary> /// <param name="strStartCell">起始單元格標識符</param> /// <param name="dtData">存儲數據的DataTable</param> /// <param name="strLinkField">連接的地址字段</param> /// <param name="strTextField">連接的文本字段</param> public void WriteTableAndLink(string strStartCell, System.Data.DataTable dtData, string strLinkField, string strTextField) { object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count - 1]; for (int i = 0; i < dtData.Rows.Count; i++) { for (int j = 0; j < dtData.Columns.Count; j++) { if (j > dtData.Columns.IndexOf(strLinkField)) arrData[i, j - 1] = dtData.Rows[i][j]; else if (j < dtData.Columns.IndexOf(strLinkField)) arrData[i, j] = dtData.Rows[i][j]; } } sheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 2)).Value2 = arrData; for (int i = 0; i < dtData.Rows.Count; i++) this.AddHyperLink(this.NtoL(this.LtoN(this.GetCellLetter(strStartCell)) + dtData.Columns.IndexOf(strTextField)) + System.Convert.ToString(this.GetCellNumber(strStartCell) + i), dtData.Rows[i][strLinkField].ToString() + ".htm", "點擊查看詳細", dtData.Rows[i][strTextField].ToString()); arrData = null; } /**/ /// <summary> /// 爲單元格設置公式 /// </summary> /// <param name="strCell">單元格標識符</param> /// <param name="strFormula">公式</param> public void SetFormula(string strCell, string strFormula) { sheet.get_Range(strCell, mValue).Formula = strFormula; } /**/ /// <summary> /// 設置單元格或連續區域的字體爲黑體 /// </summary> /// <param name="strCell">單元格標識符</param> public void SetBold(string strCell) { sheet.get_Range(strCell, mValue).Font.Bold = true; } /**/ /// <summary> /// 設置連續區域的字體爲黑體 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> public void SetBold(string strStartCell, string strEndCell) { sheet.get_Range(strStartCell, strEndCell).Font.Bold = true; } /**/ /// <summary> /// 設置單元格或連續區域的字體顏色 /// </summary> /// <param name="strCell">單元格標識符</param> /// <param name="clrColor">顏色</param> public void SetColor(string strCell, System.Drawing.Color clrColor) { sheet.get_Range(strCell, mValue).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor); } /**/ /// <summary> /// 設置連續區域的字體顏色 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> /// <param name="clrColor">顏色</param> public void SetColor(string strStartCell, string strEndCell, System.Drawing.Color clrColor) { sheet.get_Range(strStartCell, strEndCell).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor); } /**/ /// <summary> /// 設置單元格或連續區域的邊框:上下左右都爲黑色連續邊框 /// </summary> /// <param name="strCell">單元格標識符</param> public void SetBorderAll(string strCell) { sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous; } /**/ /// <summary> /// 設置連續區域的邊框:上下左右都爲黑色連續邊框 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> public void SetBorderAll(string strStartCell, string strEndCell) { sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous; sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray); sheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous; } /**/ /// <summary> /// 設置單元格或連續區域水平居左 /// </summary> /// <param name="strCell">單元格標識符</param> public void SetHAlignLeft(string strCell) { sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft; } /**/ /// <summary> /// 設置連續區域水平居左 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> public void SetHAlignLeft(string strStartCell, string strEndCell) { sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft; } /**/ /// <summary> /// 設置單元格或連續區域水平居左 /// </summary> /// <param name="strCell">單元格標識符</param> public void SetHAlignCenter(string strCell) { sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; } /**/ /// <summary> /// 設置連續區域水平居中 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> public void SetHAlignCenter(string strStartCell, string strEndCell) { sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; } /**/ /// <summary> /// 設置單元格或連續區域水平居右 /// </summary> /// <param name="strCell">單元格標識符</param> public void SetHAlignRight(string strCell) { sheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight; } /**/ /// <summary> /// 設置連續區域水平居右 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> public void SetHAlignRight(string strStartCell, string strEndCell) { sheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight; } /**/ /// <summary> /// 設置單元格或連續區域的顯示格式 /// </summary> /// <param name="strCell">單元格標識符</param> /// <param name="strNF">如"#,##0.00"的顯示格式</param> public void SetNumberFormat(string strCell, string strNF) { sheet.get_Range(strCell, mValue).NumberFormat = strNF; } /**/ /// <summary> /// 設置連續區域的顯示格式 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> /// <param name="strNF">如"#,##0.00"的顯示格式</param> public void SetNumberFormat(string strStartCell, string strEndCell, string strNF) { sheet.get_Range(strStartCell, strEndCell).NumberFormat = strNF; } /**/ /// <summary> /// 設置單元格或連續區域的字體大小 /// </summary> /// <param name="strCell">單元格或連續區域標識符</param> /// <param name="intFontSize"></param> public void SetFontSize(string strCell, int intFontSize) { sheet.get_Range(strCell, mValue).Font.Size = intFontSize.ToString(); } /**/ /// <summary> /// 設置連續區域的字體大小 /// </summary> /// <param name="strStartCell">開始單元格標識符</param> /// <param name="strEndCell">結束單元格標識符</param> /// <param name="intFontSize">字體大小</param> public void SetFontSize(string strStartCell, string strEndCell, int intFontSize) { sheet.get_Range(strStartCell, strEndCell).Font.Size = intFontSize.ToString(); } /**/ /// <summary> /// 設置列寬 /// </summary> /// <param name="strColID">列標識,如A表明第一列</param> /// <param name="decWidth">寬度</param> public void SetColumnWidth(string strColID, double dblWidth) { ((Excel.Range)sheet.Columns.GetType().InvokeMember("Item", System.Reflection.BindingFlags.GetProperty, null, sheet.Columns, new object[] { (strColID + ":" + strColID).ToString() })).ColumnWidth = dblWidth; } /**/ /// <summary> /// 爲單元格添加超級連接 /// </summary> /// <param name="strCell">單元格標識符</param> /// <param name="strAddress">連接地址</param> /// <param name="strTip">屏幕提示</param> /// <param name="strText">連接文本</param> public void AddHyperLink(string strCell, string strAddress, string strTip, string strText) { sheet.Hyperlinks.Add(sheet.get_Range(strCell, mValue), strAddress, mValue, strTip, strText); } /**/ /// <summary> /// 已知開始的單元格標識,求intR行、intColumn列後的單元格標識 /// </summary> /// <param name="strStartCell">開始單元格標識</param> /// <param name="intR">行數</param> /// <param name="intC">列數</param> /// <returns>單元格標識符結果</returns> public string GetEndCell(string strStartCell, int intR, int intC) { string endcell = string.Empty; System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)"); if (regex.IsMatch(strStartCell)) { endcell = this.NtoL(this.LtoN(regex.Match(strStartCell).Result("${vLetter}")) + intC) + System.Convert.ToString((System.Convert.ToInt32(regex.Match(strStartCell).Result("${vNumber}")) + intR)); } return endcell; } /**/ /// <summary> /// 獲取單元格標識符中的字母 /// </summary> /// <param name="strCell">單元格標識符</param> /// <returns>單元格標識符對應的字母</returns> public string GetCellLetter(string strCell) { System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)"); return regex.Match(strCell).Result("${vLetter}"); } /**/ /// <summary> /// 獲取單元格標識符中的數字 /// </summary> /// <param name="strCell">單元格標識符</param> public int GetCellNumber(string strCell) { System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)"); return System.Convert.ToInt32(regex.Match(strCell).Result("${vNumber}")); } /**/ /// <summary> /// 另存爲xls文件 /// </summary> /// <param name="strFilePath">文件路徑</param> public void SaveAs(string strFilePath) { workbook.SaveCopyAs(strFilePath); } /**/ /// <summary> /// 另存爲xls文件 /// </summary> /// <param name="strFilePath">文件路徑</param> public void Save() { workbook.Save(); } /// <summary> /// 將Excel中的數據 讀入DataTable中 /// </summary> /// <param name="filePath">excel文件的路徑</param> /// <param name="dtName">datatable的名字</param> /// <param name="headName">表頭,以逗號分隔</param> /// <returns></returns> public DataTable ReadExcel2DataTable(string filePath, string dtName, string headName) { workbook = this.appExcel.Workbooks.Open(filePath, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue); sheet = workbook.Worksheets.get_Item(1); DataTable dt = new DataTable(dtName); string[] heads = !string.IsNullOrEmpty(headName) ? headName.Split(',') : null; if (heads != null) { for (int i = 0; i < heads.Length; i++) { DataColumn column = new DataColumn(heads[i]); //這裏沒對類型 進行處理 dt.Columns.Add(column); } for (int i = 0; i <= sheet.UsedRange.Rows.Count; i++) { DataRow dr = dt.NewRow(); for (int j = 0; j < heads.Length; j++) { string cellString = NtoL(j + 1); dr[heads[j]] = sheet.get_Range(cellString + (i + 1)).Value2; } dt.Rows.Add(dr); } } else { for (int i = 0; i <= sheet.UsedRange.Rows.Count; i++) { DataRow dr = dt.NewRow(); for (int j = 0; j <= sheet.UsedRange.Columns.Count; j++) { dr[j + 1] = sheet.get_Range(NtoL(j + 1) + (i + 1)).Value2; } dt.Rows.Add(dr); } } return dt; } /**/ /// <summary> /// 另存爲html文件 /// </summary> /// <param name="strFilePath">文件路徑</param> public void SaveHtml(string strFilePath) { workbook.SaveAs(strFilePath, Excel.XlFileFormat.xlHtml, mValue, mValue, mValue, mValue, Excel.XlSaveAsAccessMode.xlNoChange, mValue, mValue, mValue, mValue, mValue); } public void CreateHtmlFile() { } /**/ /// <summary> /// 字母轉換爲數字,Excel列頭,如A-1;AA-27 /// </summary> /// <param name="strLetter">字母</param> /// <returns>字母對應的數字</returns> private int LtoN(string strLetter) { int intRtn = 0; string strLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (strLetter.Length == 2) intRtn += (strLetters.IndexOf(strLetter.Substring(0, 1)) + 1) * 26; intRtn += strLetters.IndexOf(strLetter.Substring(strLetter.Length - 1, 1)) + 1; return intRtn; } /**/ /// <summary> /// 數字轉換爲字母,Excel列頭,如1-A;27-AA /// </summary> /// <param name="intNumber">數字</param> /// <returns>數字對應的字母</returns> private string NtoL(int intNumber) { if (intNumber > 702) return String.Empty; if (intNumber == 702) return "ZZ"; string strRtn = String.Empty; string strLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if (intNumber > 26) strRtn = strLetters.Substring(intNumber / 26 - 1, 1); strRtn += strLetters.Substring((intNumber % 26) - 1, 1); return strRtn; } } }
參考:http://www.cnblogs.com/waxdoll/archive/2005/10/28/264071.html
DataTable導入Excel
Excel讀入DataTable
這裏未對類型進行處理,datetime類型的數據會轉換成數值類型的
將Excel數據表看成數據源,經過 OleDb來實現。
一樣須要引入Microsoft Excel 14.0 Object Library
分享一個操做類:
1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Data; 5 using System.Data.OleDb; 6 using System.IO; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks; 10 using System.Web; 11 using System.Web.UI; 12 using System.Web.UI.WebControls; 13 14 namespace Wolfy.Common 15 { 16 class OleDbExcelHelper 17 { 18 #region 數據導出至Excel文件 19 /// </summary> 20 /// 導出Excel文件,自動返回可下載的文件流 21 /// </summary> 22 public static void DataTable1Excel(System.Data.DataTable dtData) 23 { 24 GridView gvExport = null; 25 HttpContext curContext = HttpContext.Current; 26 StringWriter strWriter = null; 27 HtmlTextWriter htmlWriter = null; 28 if (dtData != null) 29 { 30 curContext.Response.ContentType = "application/vnd.ms-excel"; 31 curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); 32 curContext.Response.Charset = "utf-8"; 33 strWriter = new StringWriter(); 34 htmlWriter = new HtmlTextWriter(strWriter); 35 gvExport = new GridView(); 36 gvExport.DataSource = dtData.DefaultView; 37 gvExport.AllowPaging = false; 38 gvExport.DataBind(); 39 gvExport.RenderControl(htmlWriter); 40 curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString()); 41 curContext.Response.End(); 42 } 43 } 44 45 /// <summary> 46 /// 導出Excel文件,轉換爲可讀模式 47 /// </summary> 48 public static void DataTable2Excel(System.Data.DataTable dtData) 49 { 50 DataGrid dgExport = null; 51 HttpContext curContext = HttpContext.Current; 52 StringWriter strWriter = null; 53 HtmlTextWriter htmlWriter = null; 54 55 if (dtData != null) 56 { 57 curContext.Response.ContentType = "application/vnd.ms-excel"; 58 curContext.Response.ContentEncoding = System.Text.Encoding.UTF8; 59 curContext.Response.Charset = ""; 60 strWriter = new StringWriter(); 61 htmlWriter = new HtmlTextWriter(strWriter); 62 dgExport = new DataGrid(); 63 dgExport.DataSource = dtData.DefaultView; 64 dgExport.AllowPaging = false; 65 dgExport.DataBind(); 66 dgExport.RenderControl(htmlWriter); 67 curContext.Response.Write(strWriter.ToString()); 68 curContext.Response.End(); 69 } 70 } 71 72 /// <summary> 73 /// 導出Excel文件,並自定義文件名 74 /// </summary> 75 public static void DataTable3Excel(System.Data.DataTable dtData, String FileName) 76 { 77 GridView dgExport = null; 78 HttpContext curContext = HttpContext.Current; 79 StringWriter strWriter = null; 80 HtmlTextWriter htmlWriter = null; 81 82 if (dtData != null) 83 { 84 HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8); 85 curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls"); 86 curContext.Response.ContentType = "application nd.ms-excel"; 87 curContext.Response.ContentEncoding = System.Text.Encoding.UTF8; 88 curContext.Response.Charset = "GB2312"; 89 strWriter = new StringWriter(); 90 htmlWriter = new HtmlTextWriter(strWriter); 91 dgExport = new GridView(); 92 dgExport.DataSource = dtData.DefaultView; 93 dgExport.AllowPaging = false; 94 dgExport.DataBind(); 95 dgExport.RenderControl(htmlWriter); 96 curContext.Response.Write(strWriter.ToString()); 97 curContext.Response.End(); 98 } 99 } 100 101 /// <summary> 102 /// 將數據導出至Excel文件 103 /// </summary> 104 /// <param name="Table">DataTable對象</param> 105 /// <param name="ExcelFilePath">Excel文件路徑</param> 106 public static bool OutputToExcel(System.Data.DataTable Table, string ExcelFilePath) 107 { 108 if (File.Exists(ExcelFilePath)) 109 { 110 throw new Exception("該文件已經存在!"); 111 } 112 113 if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table")) 114 { 115 Table.TableName = "Sheet1"; 116 } 117 118 //數據表的列數 119 int ColCount = Table.Columns.Count; 120 121 //用於記數,實例化參數時的序號 122 int i = 0; 123 124 //建立參數 125 OleDbParameter[] para = new OleDbParameter[ColCount]; 126 127 //建立表結構的SQL語句 128 string TableStructStr = @"Create Table " + Table.TableName + "("; 129 130 //鏈接字符串 131 string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;"; 132 OleDbConnection objConn = new OleDbConnection(connString); 133 134 //建立表結構 135 OleDbCommand objCmd = new OleDbCommand(); 136 137 //數據類型集合 138 ArrayList DataTypeList = new ArrayList(); 139 DataTypeList.Add("System.Decimal"); 140 DataTypeList.Add("System.Double"); 141 DataTypeList.Add("System.Int16"); 142 DataTypeList.Add("System.Int32"); 143 DataTypeList.Add("System.Int64"); 144 DataTypeList.Add("System.Single"); 145 146 //遍歷數據表的全部列,用於建立表結構 147 foreach (DataColumn col in Table.Columns) 148 { 149 //若是列屬於數字列,則設置該列的數據類型爲double 150 if (DataTypeList.IndexOf(col.DataType.ToString()) >= 0) 151 { 152 para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.Double); 153 objCmd.Parameters.Add(para[i]); 154 155 //若是是最後一列 156 if (i + 1 == ColCount) 157 { 158 TableStructStr += col.ColumnName + " double)"; 159 } 160 else 161 { 162 TableStructStr += col.ColumnName + " double,"; 163 } 164 } 165 else 166 { 167 para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.VarChar); 168 objCmd.Parameters.Add(para[i]); 169 170 //若是是最後一列 171 if (i + 1 == ColCount) 172 { 173 TableStructStr += col.ColumnName + " varchar)"; 174 } 175 else 176 { 177 TableStructStr += col.ColumnName + " varchar,"; 178 } 179 } 180 i++; 181 } 182 183 //建立Excel文件及文件結構 184 try 185 { 186 objCmd.Connection = objConn; 187 objCmd.CommandText = TableStructStr; 188 189 if (objConn.State == ConnectionState.Closed) 190 { 191 objConn.Open(); 192 } 193 objCmd.ExecuteNonQuery(); 194 } 195 catch (Exception exp) 196 { 197 throw exp; 198 } 199 200 //插入記錄的SQL語句 201 string InsertSql_1 = "Insert into " + Table.TableName + " ("; 202 string InsertSql_2 = " Values ("; 203 string InsertSql = ""; 204 205 //遍歷全部列,用於插入記錄,在此建立插入記錄的SQL語句 206 for (int colID = 0; colID < ColCount; colID++) 207 { 208 if (colID + 1 == ColCount) //最後一列 209 { 210 InsertSql_1 += Table.Columns[colID].ColumnName + ")"; 211 InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ")"; 212 } 213 else 214 { 215 InsertSql_1 += Table.Columns[colID].ColumnName + ","; 216 InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ","; 217 } 218 } 219 220 InsertSql = InsertSql_1 + InsertSql_2; 221 222 //遍歷數據表的全部數據行 223 for (int rowID = 0; rowID < Table.Rows.Count; rowID++) 224 { 225 for (int colID = 0; colID < ColCount; colID++) 226 { 227 if (para[colID].DbType == DbType.Double && Table.Rows[rowID][colID].ToString().Trim() == "") 228 { 229 para[colID].Value = 0; 230 } 231 else 232 { 233 para[colID].Value = Table.Rows[rowID][colID].ToString().Trim(); 234 } 235 } 236 try 237 { 238 objCmd.CommandText = InsertSql; 239 objCmd.ExecuteNonQuery(); 240 } 241 catch (Exception exp) 242 { 243 string str = exp.Message; 244 } 245 } 246 try 247 { 248 if (objConn.State == ConnectionState.Open) 249 { 250 objConn.Close(); 251 } 252 } 253 catch (Exception exp) 254 { 255 throw exp; 256 } 257 return true; 258 } 259 260 /// <summary> 261 /// 將數據導出至Excel文件 262 /// </summary> 263 /// <param name="Table">DataTable對象</param> 264 /// <param name="Columns">要導出的數據列集合</param> 265 /// <param name="ExcelFilePath">Excel文件路徑</param> 266 public static bool OutputToExcel(System.Data.DataTable Table, ArrayList Columns, string ExcelFilePath) 267 { 268 if (File.Exists(ExcelFilePath)) 269 { 270 throw new Exception("該文件已經存在!"); 271 } 272 273 //若是數據列數大於表的列數,取數據表的全部列 274 if (Columns.Count > Table.Columns.Count) 275 { 276 for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++) 277 { 278 Columns.RemoveAt(s); //移除數據表列數後的全部列 279 } 280 } 281 282 //遍歷全部的數據列,若是有數據列的數據類型不是 DataColumn,則將它移除 283 DataColumn column = new DataColumn(); 284 for (int j = 0; j < Columns.Count; j++) 285 { 286 try 287 { 288 column = (DataColumn)Columns[j]; 289 } 290 catch (Exception) 291 { 292 Columns.RemoveAt(j); 293 } 294 } 295 if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table")) 296 { 297 Table.TableName = "Sheet1"; 298 } 299 300 //數據表的列數 301 int ColCount = Columns.Count; 302 303 //建立參數 304 OleDbParameter[] para = new OleDbParameter[ColCount]; 305 306 //建立表結構的SQL語句 307 string TableStructStr = @"Create Table " + Table.TableName + "("; 308 309 //鏈接字符串 310 string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;"; 311 OleDbConnection objConn = new OleDbConnection(connString); 312 313 //建立表結構 314 OleDbCommand objCmd = new OleDbCommand(); 315 316 //數據類型集合 317 ArrayList DataTypeList = new ArrayList(); 318 DataTypeList.Add("System.Decimal"); 319 DataTypeList.Add("System.Double"); 320 DataTypeList.Add("System.Int16"); 321 DataTypeList.Add("System.Int32"); 322 DataTypeList.Add("System.Int64"); 323 DataTypeList.Add("System.Single"); 324 325 DataColumn col = new DataColumn(); 326 327 //遍歷數據表的全部列,用於建立表結構 328 for (int k = 0; k < ColCount; k++) 329 { 330 col = (DataColumn)Columns[k]; 331 332 //列的數據類型是數字型 333 if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0) 334 { 335 para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double); 336 objCmd.Parameters.Add(para[k]); 337 338 //若是是最後一列 339 if (k + 1 == ColCount) 340 { 341 TableStructStr += col.Caption.Trim() + " Double)"; 342 } 343 else 344 { 345 TableStructStr += col.Caption.Trim() + " Double,"; 346 } 347 } 348 else 349 { 350 para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar); 351 objCmd.Parameters.Add(para[k]); 352 353 //若是是最後一列 354 if (k + 1 == ColCount) 355 { 356 TableStructStr += col.Caption.Trim() + " VarChar)"; 357 } 358 else 359 { 360 TableStructStr += col.Caption.Trim() + " VarChar,"; 361 } 362 } 363 } 364 365 //建立Excel文件及文件結構 366 try 367 { 368 objCmd.Connection = objConn; 369 objCmd.CommandText = TableStructStr; 370 371 if (objConn.State == ConnectionState.Closed) 372 { 373 objConn.Open(); 374 } 375 objCmd.ExecuteNonQuery(); 376 } 377 catch (Exception exp) 378 { 379 throw exp; 380 } 381 382 //插入記錄的SQL語句 383 string InsertSql_1 = "Insert into " + Table.TableName + " ("; 384 string InsertSql_2 = " Values ("; 385 string InsertSql = ""; 386 387 //遍歷全部列,用於插入記錄,在此建立插入記錄的SQL語句 388 for (int colID = 0; colID < ColCount; colID++) 389 { 390 if (colID + 1 == ColCount) //最後一列 391 { 392 InsertSql_1 += Columns[colID].ToString().Trim() + ")"; 393 InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")"; 394 } 395 else 396 { 397 InsertSql_1 += Columns[colID].ToString().Trim() + ","; 398 InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ","; 399 } 400 } 401 402 InsertSql = InsertSql_1 + InsertSql_2; 403 404 //遍歷數據表的全部數據行 405 DataColumn DataCol = new DataColumn(); 406 for (int rowID = 0; rowID < Table.Rows.Count; rowID++) 407 { 408 for (int colID = 0; colID < ColCount; colID++) 409 { 410 //由於列不連續,因此在取得單元格時不能用行列編號,列需得用列的名稱 411 DataCol = (DataColumn)Columns[colID]; 412 if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "") 413 { 414 para[colID].Value = 0; 415 } 416 else 417 { 418 para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim(); 419 } 420 } 421 try 422 { 423 objCmd.CommandText = InsertSql; 424 objCmd.ExecuteNonQuery(); 425 } 426 catch (Exception exp) 427 { 428 string str = exp.Message; 429 } 430 } 431 try 432 { 433 if (objConn.State == ConnectionState.Open) 434 { 435 objConn.Close(); 436 } 437 } 438 catch (Exception exp) 439 { 440 throw exp; 441 } 442 return true; 443 } 444 #endregion 445 446 /// <summary> 447 /// 獲取Excel文件數據表列表 448 /// </summary> 449 public static ArrayList GetExcelTables(string ExcelFileName) 450 { 451 System.Data.DataTable dt = new System.Data.DataTable(); 452 ArrayList TablesList = new ArrayList(); 453 if (File.Exists(ExcelFileName)) 454 { 455 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName)) 456 { 457 try 458 { 459 conn.Open(); 460 dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 461 } 462 catch (Exception exp) 463 { 464 throw exp; 465 } 466 467 //獲取數據表個數 468 int tablecount = dt.Rows.Count; 469 for (int i = 0; i < tablecount; i++) 470 { 471 string tablename = dt.Rows[i][2].ToString().Trim().TrimEnd('$'); 472 if (TablesList.IndexOf(tablename) < 0) 473 { 474 TablesList.Add(tablename); 475 } 476 } 477 } 478 } 479 return TablesList; 480 } 481 482 /// <summary> 483 /// 將Excel文件導出至DataTable(第一行做爲表頭) 484 /// </summary> 485 /// <param name="ExcelFilePath">Excel文件路徑</param> 486 /// <param name="TableName">數據表名,若是數據表名錯誤,默認爲第一個數據表名</param> 487 public static DataTable InputFromExcel(string ExcelFilePath, string TableName) 488 { 489 if (!File.Exists(ExcelFilePath)) 490 { 491 throw new Exception("Excel文件不存在!"); 492 } 493 494 //若是數據表名不存在,則數據表名爲Excel文件的第一個數據表 495 ArrayList TableList = new ArrayList(); 496 TableList = GetExcelTables(ExcelFilePath); 497 498 if (TableName.IndexOf(TableName) < 0) 499 { 500 TableName = TableList[0].ToString().Trim(); 501 } 502 503 DataTable table = new DataTable(); 504 OleDbConnection dbcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0"); 505 OleDbCommand cmd = new OleDbCommand("select * from [" + TableName + "$]", dbcon); 506 OleDbDataAdapter adapter = new OleDbDataAdapter(cmd); 507 508 try 509 { 510 if (dbcon.State == ConnectionState.Closed) 511 { 512 dbcon.Open(); 513 } 514 adapter.Fill(table); 515 } 516 catch (Exception exp) 517 { 518 throw exp; 519 } 520 finally 521 { 522 if (dbcon.State == ConnectionState.Open) 523 { 524 dbcon.Close(); 525 } 526 } 527 return table; 528 } 529 530 /// <summary> 531 /// 獲取Excel文件指定數據表的數據列表 532 /// </summary> 533 /// <param name="ExcelFileName">Excel文件名</param> 534 /// <param name="TableName">數據表名</param> 535 public static ArrayList GetExcelTableColumns(string ExcelFileName, string TableName) 536 { 537 DataTable dt = new DataTable(); 538 ArrayList ColsList = new ArrayList(); 539 if (File.Exists(ExcelFileName)) 540 { 541 using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName)) 542 { 543 conn.Open(); 544 dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null }); 545 546 //獲取列個數 547 int colcount = dt.Rows.Count; 548 for (int i = 0; i < colcount; i++) 549 { 550 string colname = dt.Rows[i]["Column_Name"].ToString().Trim(); 551 ColsList.Add(colname); 552 } 553 } 554 } 555 return ColsList; 556 } 557 } 558 }
網上搜集的經常使用類,這裏再也不測試。
將Excel另存爲xml文件,對xml文件進行操做。
1 <Row> 2 <Cell><Data ss:Type="String">998</Data></Cell> 3 <Cell><Data ss:Type="String">柳雪巧</Data></Cell> 4 <Cell><Data ss:Type="String">f</Data></Cell> 5 <Cell><Data ss:Type="String">1971/4/30 0:00:00</Data></Cell> 6 <Cell><Data ss:Type="String">2005/1/15 0:00:00</Data></Cell> 7 <Cell><Data ss:Type="String">臺灣省 屏東縣</Data></Cell> 8 <Cell><Data ss:Type="String">Dolores19710430@139.com</Data></Cell> 9 <Cell><Data ss:Type="String">12616310511</Data></Cell> 10 <Cell><Data ss:Type="String">False</Data></Cell> 11 <Cell><Data ss:Type="String">2014/3/15 10:13:54</Data></Cell> 12 <Cell><Data ss:Type="String">5</Data></Cell> 13 </Row>
excel表格中每一行數據,實際上是以上格式的xml,有規律,就能夠很容易的去解析。
js插件
官網地址:http://datatables.net/extras/tabletools/
導出爲csv文件
分享一個輔助類
1 using System.Data; 2 using System.IO; 3 4 public static class CsvHelper 5 { 6 /// <summary> 7 /// 導出報表爲Csv 8 /// </summary> 9 /// <param name="dt">DataTable</param> 10 /// <param name="strFilePath">物理路徑</param> 11 /// <param name="tableheader">表頭</param> 12 /// <param name="columname">字段標題,逗號分隔</param> 13 public static bool dt2csv(DataTable dt, string strFilePath, string tableheader, string columname) 14 { 15 try 16 { 17 string strBufferLine = ""; 18 StreamWriter strmWriterObj = new StreamWriter(strFilePath,false,System.Text.Encoding.UTF8); 19 strmWriterObj.WriteLine(tableheader); 20 strmWriterObj.WriteLine(columname); 21 for (int i = 0; i < dt.Rows.Count; i++) 22 { 23 strBufferLine = ""; 24 for (int j = 0; j < dt.Columns.Count; j++) 25 { 26 if (j > 0) 27 strBufferLine += ","; 28 strBufferLine += dt.Rows[i][j].ToString(); 29 } 30 strmWriterObj.WriteLine(strBufferLine); 31 } 32 strmWriterObj.Close(); 33 return true; 34 } 35 catch 36 { 37 return false; 38 } 39 } 40 41 /// <summary> 42 /// 將Csv讀入DataTable 43 /// </summary> 44 /// <param name="filePath">csv文件路徑</param> 45 /// <param name="n">表示第n行是字段title,第n+1行是記錄開始</param> 46 public static DataTable csv2dt(string filePath, int n, DataTable dt) 47 { 48 StreamReader reader = new StreamReader(filePath, System.Text.Encoding.UTF8, false); 49 int i = 0, m = 0; 50 reader.Peek(); 51 while (reader.Peek() > 0) 52 { 53 m = m + 1; 54 string str = reader.ReadLine(); 55 if (m >= n + 1) 56 { 57 string[] split = str.Split(','); 58 59 System.Data.DataRow dr = dt.NewRow(); 60 for (i = 0; i < split.Length; i++) 61 { 62 dr[i] = split[i]; 63 } 64 dt.Rows.Add(dr); 65 } 66 } 67 return dt; 68 } 69 }
再也不測試。
使用模版的方式,最簡單的模版,就是將表頭列出,而後再導入數據。第一行爲表頭,從第二行開始寫入數據。導入過程可參考前面的解決方案。
使用Aspose.Cells組件,貌似收費。
可參考:http://www.cnblogs.com/lanyue52011/p/3372452.html
http://www.cnblogs.com/hongjiumu/archive/2013/03/15/2962277.html
http://www.cnblogs.com/wujy/archive/2012/07/19/2600162.html
OpenXML
OpenXML庫:DocumentFormat.OpenXml.dll;
參考:http://www.cnblogs.com/zlgcool/archive/2008/12/31/1365993.html
http://blog.sina.com.cn/s/blog_46e9573c01011bvs.html
Epplus操做Excel200七、2010
參考:http://www.cnblogs.com/xinchen/archive/2012/02/15/2352920.html
http://blog.csdn.net/rrrrssss00/article/details/6590944
列出常見的幾種解決方案,在實際項目中,用哪種,仍是根據項目環境來決定吧。
最近項目中用到了Excel導出,導入的功能,就想着將常見的方式總結一下。也許還有遺漏,請留言,將你知道也分享給你們,謝謝。
若是該文章對你有所幫助,不妨推薦一下,讓更多的人知道,畢竟分享是件快樂的事情。
代碼下載:連接:http://pan.baidu.com/s/1dD3lleT 密碼:axli