/* *引用 NuGet包 Spire.XLS */ /// <summary> /// Excel幫助類 /// </summary> public class ExcelHelper { /// <summary> /// 將Excel以文件流轉換DataTable /// </summary> /// <param name="hasTitle">是否有表頭</param> /// <param name="path">文件路徑</param> /// <param name="tableindex">文件簿索引</param> public DataTable ExcelToDataTableFormPath(bool hasTitle = true, string path = "", int tableindex = 0) { //新建Workbook Workbook workbook = new Workbook(); //將當前路徑下的文件內容讀取到workbook對象裏面 workbook.LoadFromFile(path); //獲得第一個Sheet頁 Worksheet sheet = workbook.Worksheets[tableindex]; return SheetToDataTable(hasTitle, sheet); } /// <summary> /// 將Excel以文件流轉換DataTable /// </summary> /// <param name="hasTitle">是否有表頭</param> /// <param name="stream">文件流</param> /// <param name="tableindex">文件簿索引</param> public DataTable ExcelToDataTableFormStream(bool hasTitle = true, Stream stream = null, int tableindex = 0) { //新建Workbook Workbook workbook = new Workbook(); //將文件流內容讀取到workbook對象裏面 workbook.LoadFromStream(stream); //獲得第一個Sheet頁 Worksheet sheet = workbook.Worksheets[tableindex]; return SheetToDataTable(hasTitle, sheet); } private DataTable SheetToDataTable(bool hasTitle, Worksheet sheet) { int iRowCount = sheet.Rows.Length; int iColCount = sheet.Columns.Length; DataTable dt = new DataTable(); //生成列頭 for (int i = 0; i < iColCount; i++) { var name = "column" + i; if (hasTitle) { var txt = sheet.Range[1, i + 1].Text; if (!string.IsNullOrEmpty(txt)) name = txt; } while (dt.Columns.Contains(name)) name = name + "_1";//重複行名稱會報錯。 dt.Columns.Add(new DataColumn(name, typeof(string))); } //生成行數據 int rowIdx = hasTitle ? 2 : 1; for (int iRow = rowIdx; iRow <= iRowCount; iRow++) { DataRow dr = dt.NewRow(); for (int iCol = 1; iCol <= iColCount; iCol++) { dr[iCol - 1] = sheet.Range[iRow, iCol].Text; } dt.Rows.Add(dr); } return RemoveEmpty(dt); } /// <summary> /// 去除空行 /// </summary> /// <param name="dt"></param> /// <returns></returns> private DataTable RemoveEmpty(DataTable dt) { List<DataRow> removelist = new List<DataRow>(); for (int i = 0; i < dt.Rows.Count; i++) { bool rowdataisnull = true; for (int j = 0; j < dt.Columns.Count; j++) { if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim())) { rowdataisnull = false; } } if (rowdataisnull) { removelist.Add(dt.Rows[i]); } } for (int i = 0; i < removelist.Count; i++) { dt.Rows.Remove(removelist[i]); } return dt; } }