using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml; using System.Data; using System.IO; using System.Data.OleDb; using Aspose.Cells; using System.Reflection; namespace Utils { /// <summary> /// 解析Excel文件 /// </summary> public class ExcelUitl { public static DataSet ExcelToDS(string Path) { DataSet ds = new DataSet(); Workbook workbook = new Workbook(); workbook.Open(Path); Cells cells = workbook.Worksheets[0].Cells; DataTable dt = cells.ExportDataTableAsString(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1, true); ds.Tables.Add(dt); return ds; } public static DataSet ExcelToDS(string Path, string sheetName) { DataSet ds = new DataSet(); Workbook workbook = new Workbook(); workbook.Open(Path); Worksheet sheet = workbook.Worksheets[sheetName]; if (sheet == null) { return null; } Cells cells = sheet.Cells; DataTable dt = cells.ExportDataTableAsString(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1, true); ds.Tables.Add(dt); return ds; } public static DataSet GetTableList(string Path) { DataSet ds = new DataSet(); Workbook workbook = new Workbook(); workbook.Open(Path); if (workbook.Worksheets != null) { foreach (Worksheet sheet in workbook.Worksheets) { Cells cells = sheet.Cells; DataTable dt = cells.ExportDataTableAsString(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1, true); dt.TableName = sheet.Name; ds.Tables.Add(dt); } } return ds; } /// <summary> /// </summary> /// <param name="tablelist"></param> /// <param name="path"></param> /// <param name="error"></param> public static void ImportAndZip(List<DataTable> tablelist, string excelFilePath) { Workbook workbook = new Workbook(); int sheetIndex = 0; string dir = excelFilePath.Replace(Path.GetFileName(excelFilePath), ""); string txtdir = Path.Combine(dir, "sco"); if (!Directory.Exists(txtdir)) { Directory.CreateDirectory(txtdir); } DataTable error = new DataTable(); error.TableName = "导出情况表"; error.Columns.Add(new DataColumn() { ColumnName = "错误工作簿名称", }); error.Columns.Add(new DataColumn() { ColumnName = "错误工作簿行", }); error.Columns.Add(new DataColumn() { ColumnName = "错误工作簿列名", }); error.Columns.Add(new DataColumn() { ColumnName = "错误原因", }); error.Columns.Add(new DataColumn() { ColumnName = "导入路径", }); foreach (DataTable table in tablelist) { Worksheet sheet = null; if (sheetIndex == 0) { sheet = workbook.Worksheets[sheetIndex]; sheet.Name = table.TableName; } else { sheet = workbook.Worksheets.Add(table.TableName); } //标题 int indexX = 0, indexY = 0; foreach (DataColumn column in table.Columns) { sheet.Cells[indexX, indexY].PutValue(column.ColumnName); indexY++; } int Colnum = table.Columns.Count;//表格列数 int Rownum = table.Rows.Count;//表格行数 //生成数据行 for (int i = 0; i < Rownum; i++) { for (int k = 0; k < Colnum; k++) { try { //单元格最大存 32k内容 sheet.Cells[1 + i, k].PutValue(table.Rows[i][k].ToString()); //添加数据 } catch (Exception ex) { string message = ""; string txtName = table.TableName + "_" + i + ".txt"; string txtPath = ""; if (ex.Message.ToString().Contains("MS Excel only allows to put a string shorter than 32K to a Cell")) { message = "单元格数据大于32K不能写入excel"; //将内容写入txt File.WriteAllText(Path.Combine(txtdir, txtName), table.Rows[i][k].ToString()); txtPath = "sco/" + txtName; } else { message = ex.Message.ToString(); } //sun: 当数据太大。我们不导入excel,将文本导入txt,路径路径 error.Rows.Add(new object[] { sheet.Name, i, table.Columns[k].ColumnName, message, txtPath }); } } } SetHeaderStyle(sheet); //sheet个数 sheetIndex++; } //将错误信息表也写入excel Worksheet errrsheet = workbook.Worksheets.Add(error.TableName); for (int i = 0; i < error.Columns.Count; i++) { errrsheet.Cells[0, i].PutValue(error.Columns[i].ColumnName); } //foreach (DataColumn column in error.Columns) //{ // errrsheet.Cells[0, 0].PutValue(column.ColumnName); //} int eColnum = error.Columns.Count;//表格列数 int eRownum = error.Rows.Count;//表格行数 for (int i = 0; i < eRownum; i++) { for (int k = 0; k < eColnum; k++) { errrsheet.Cells[1 + i, k].PutValue(error.Rows[i][k].ToString()); //添加数据 } } SetHeaderStyle(errrsheet); workbook.Save(excelFilePath); } /// <summary> /// 创建excel /// </summary> /// <param name="tablelist"></param> /// <param name="path"></param> public static void CreateExcel(List<DataTable> tablelist, string path) { Workbook workbook = new Workbook(); int sheetIndex = 0; foreach (DataTable table in tablelist) { Worksheet sheet = null; if (sheetIndex == 0) { sheet = workbook.Worksheets[sheetIndex]; sheet.Name = table.TableName; } else { sheet = workbook.Worksheets.Add(table.TableName); } //标题 int indexX = 0, indexY = 0; foreach (DataColumn column in table.Columns) { sheet.Cells[indexX, indexY].PutValue(column.ColumnName); indexY++; } int Colnum = table.Columns.Count;//表格列数 int Rownum = table.Rows.Count;//表格行数 //生成数据行 for (int i = 0; i < Rownum; i++) { for (int k = 0; k < Colnum; k++) { try { //单元格最大存 32k内容 sheet.Cells[1 + i, k].PutValue(table.Rows[i][k].ToString()); //添加数据 } catch (Exception ex) { //sun: 当数据太大。我们不导入 } } } SetHeaderStyle(sheet); //sheet个数 sheetIndex++; } workbook.Save(path); } public static void SetHeaderStyle(Worksheet sheet) { #region header style Style style = new Style(); style.Font.IsBold = true; style.Font.Size = 12; StyleFlag styleFlag = new StyleFlag { FontBold = true, FontSize = true, }; sheet.Cells.ApplyRowStyle(0, style, styleFlag); sheet.AutoFitColumns(); #endregion } public static void SetBodyStyle(Worksheet sheet, int column) { #region header style Style style = new Style(); style.Font.IsBold = false; style.Font.Size = 11; StyleFlag styleFlag = new StyleFlag { FontBold = true, FontSize = true }; sheet.Cells.ApplyColumnStyle(column, style, styleFlag); sheet.AutoFitColumns(); #endregion } } }