using System; using System.Collections.Generic; using System.Text; using System.IO; using NPOI.HSSF.UserModel; using System.Data; using System.Drawing; using NPOI.HSSF.Util; using NPOI.SS.UserModel; using NPOI.HPSF; using NPOI.XSSF.UserModel; namespace WebAPI.Controllers.SCGL.日计划管理 { /// /// Excel文件到DataSet的转换类 /// public class NpoiHelper { #region 读取Excel文件内容转换为DataSet int ReadExcelEndRow = 0; /// /// 读取Excel文件内容转换为DataSet,列名依次为 "c0"……c[columnlength-1] /// /// 文件绝对路径 /// 数据开始行数(1为第一行) /// 每列的数据类型 /// 获取数据簿的类型 /// 工作簿的名字 /// public DataSet ReadExcel(string FileName, int startRow,int numType,string name, params NpoiDataType[] ColumnDataType) { string colNamePix = "F"; int ertime = 0; int intime = 0; DataSet ds = new DataSet("ds"); DataTable dt = new DataTable("dt"); DataRow dr; StringBuilder sb = new StringBuilder(); using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = WorkbookFactory.Create(stream);//使用接口,自动识别excel2003/2007格式 //for (int k = 0; k < 14; k++) ISheet sheet = null ; //{ if (numType == 1)//numType==1 获取工作簿按照下标 { sheet = workbook.GetSheetAt(int.Parse(name));//得到里面第一个sheet } else if (numType == 2)//numType==12 获取工作簿按照 工作簿的名字 { sheet = workbook.GetSheet(name);//得到里面第一个sheet } int j; IRow row; #region ColumnDataType赋值 if (ColumnDataType.Length <= 0) { row = sheet.GetRow(startRow - 1);//得到第i行 ColumnDataType = new NpoiDataType[row.LastCellNum]; for (int i = 0; i < row.LastCellNum; i++) { ICell hs = row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK); ColumnDataType[i] = GetCellDataType(hs); //NpoiDataType.Blank; //if (i == 6) //{ // ColumnDataType[i] = NpoiDataType.Numeric; //} } } #endregion for (j = 0; j < ColumnDataType.Length; j++) { Type tp = GetDataTableType(ColumnDataType[j]); //if (j == 6) //{ // tp = typeof(double); //} dt.Columns.Add(colNamePix + (j + 1), tp); } ReadExcelEndRow = ReadExcelEndRow == 0 ? sheet.PhysicalNumberOfRows : ReadExcelEndRow; for (int i = startRow - 1; i <= ReadExcelEndRow; i++) { row = sheet.GetRow(i);//得到第i行 if (row == null) continue; try { dr = dt.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt.Rows.Add(dr); intime++; } catch (Exception er) { ertime++; sb.Append(string.Format("第{0}行出错:{1}\r\n", i + 1, er.Message)); continue; } } ds.Tables.Add(dt); //} } if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString()); return ds; } #endregion #region//读取多个sheet public DataSet ReadExcelSub(string FileName, int startRow, params NpoiDataType[] ColumnDataType) { string colNamePix = "F"; int ertime = 0; int intime = 0; DataSet ds = new DataSet("ds"); DataTable dt0 = new DataTable("dt0"); DataTable dt1 = new DataTable("dt1"); DataTable dt2 = new DataTable("dt2"); DataTable dt3 = new DataTable("dt3"); DataTable dt4 = new DataTable("dt4"); DataTable dt5 = new DataTable("dt5"); DataTable dt6 = new DataTable("dt6"); DataTable dt7 = new DataTable("dt7"); DataTable dt8 = new DataTable("dt8"); DataTable dt9 = new DataTable("dt9"); DataTable dt10 = new DataTable("dt10"); DataTable dt11 = new DataTable("dt11"); DataTable dt12 = new DataTable("dt12"); DataTable dt13 = new DataTable("dt13"); DataRow dr; StringBuilder sb = new StringBuilder(); using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read)) { //根据路径通过已存在的excel来创建HSSFWorkbook,即整个excel文档 HSSFWorkbook workbook = new HSSFWorkbook(stream); //XSSFWorkbook workbook = new XSSFWorkbook(stream); int x = workbook.NumberOfSheets; List sheetNames = new List(); for (int i = 0; i < x; i++) { //sheetNames.Add(workbook.Workbook.GetSheetName(i)); ISheet sheet = workbook.GetSheetAt(i); int j; IRow row; #region ColumnDataType赋值 if (ColumnDataType.Length <= 0) { row = sheet.GetRow(startRow - 1);//得到第i行 ColumnDataType = new NpoiDataType[row.LastCellNum]; for (int a = 0; x < row.LastCellNum; a++) { ICell hs = row.GetCell(a, MissingCellPolicy.CREATE_NULL_AS_BLANK); ColumnDataType[a] = GetCellDataType(hs); //NpoiDataType.Blank; } } #endregion for (j = 0; j < ColumnDataType.Length; j++) { Type tp = GetDataTableType(ColumnDataType[j]);//得到每一列的类型 ReadExcelEndRow = 0; if (i == 0) { dt0.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 1) { dt1.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 2) { dt2.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 3) { dt3.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 4) { dt4.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 5) { dt5.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 6) { dt6.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 7) { dt7.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 8) { dt8.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 9) { dt9.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 10) { dt10.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 11) { dt11.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 12) { dt12.Columns.Add(colNamePix + (j + 1), tp); } else if (i == 13) { dt13.Columns.Add(colNamePix + (j + 1), tp); } } ReadExcelEndRow = ReadExcelEndRow == 0 ? sheet.PhysicalNumberOfRows : ReadExcelEndRow; for (int a = startRow - 1; a <= ReadExcelEndRow; a++) { row = sheet.GetRow(a);//得到第i行 if (row == null) continue; try { if (i == 0) { dr = dt0.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt0.Rows.Add(dr); intime++; } else if (i == 1) { dr = dt1.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt1.Rows.Add(dr); intime++; } else if (i == 2) { dr = dt2.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt2.Rows.Add(dr); intime++; } else if (i == 3) { dr = dt3.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt3.Rows.Add(dr); intime++; } else if (i == 4) { dr = dt4.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt4.Rows.Add(dr); intime++; } else if (i == 5) { dr = dt5.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt5.Rows.Add(dr); intime++; } else if (i == 6) { dr = dt6.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt6.Rows.Add(dr); intime++; } else if (i == 7) { dr = dt7.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt7.Rows.Add(dr); intime++; } else if (i == 8) { dr = dt8.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt8.Rows.Add(dr); intime++; } else if (i == 9) { dr = dt9.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt9.Rows.Add(dr); intime++; } else if (i == 10) { dr = dt10.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt10.Rows.Add(dr); intime++; } else if (i == 11) { dr = dt11.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt11.Rows.Add(dr); intime++; } else if (i == 12) { dr = dt12.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt12.Rows.Add(dr); intime++; } else if (i == 13) { dr = dt13.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j + 1)] = GetCellData(ColumnDataType[j], row, j); } dt13.Rows.Add(dr); intime++; } } catch (Exception er) { ertime++; sb.Append(string.Format("第{0}行出错:{1}\r\n", i + 1, er.Message)); continue; } } if (i == 0) { ds.Tables.Add(dt0); } else if (i == 1) { ds.Tables.Add(dt1); } else if (i == 2) { ds.Tables.Add(dt2); } else if (i == 3) { ds.Tables.Add(dt3); } else if (i == 4) { ds.Tables.Add(dt4); } else if (i == 5) { ds.Tables.Add(dt5); } else if (i == 6) { ds.Tables.Add(dt6); } else if (i == 7) { ds.Tables.Add(dt7); } else if (i == 8) { ds.Tables.Add(dt8); } else if (i == 9) { ds.Tables.Add(dt9); } else if (i == 10) { ds.Tables.Add(dt10); } else if (i == 11) { ds.Tables.Add(dt11); } else if (i == 12) { ds.Tables.Add(dt12); } else if (i == 13) { ds.Tables.Add(dt13); } } //IWorkbook workbook = WorkbookFactory.Create(stream);//使用接口,自动识别excel2003/2007格式 //ISheet sheet = workbook.GetSheetAt(0);//得到里面第一个sheet } //if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString()); return ds; } #endregion Color LevelOneColor = Color.Green; Color LevelTwoColor = Color.FromArgb(201, 217, 243); Color LevelThreeColor = Color.FromArgb(231, 238, 248); Color LevelFourColor = Color.FromArgb(232, 230, 231); Color LevelFiveColor = Color.FromArgb(250, 252, 213); public List ReadExcelBySheetIndex(string FileName, int startRow, string str) { List listDs = new List(); StringBuilder sb = new StringBuilder(); using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = WorkbookFactory.Create(stream);//使用接口,自动识别excel2003/2007格式 // ISheet sheet = workbook.GetSheetAt(SheetIndex);//得到里面第一个sheet List listSheet = GetSheetNames(workbook); ISheet sheet; foreach (string sheetName in listSheet) { DataSet ds = new DataSet("ds"); DataTable dt = new DataTable("dt"); sheet = workbook.GetSheet(sheetName); if (!sheetName.Contains(str)) { continue; } NPOI.SS.UserModel.IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { NPOI.SS.UserModel.ICell cell = headerRow.GetCell(j); dt.Columns.Add("F" + j.ToString()); } int r = sheet.PhysicalNumberOfRows; for (int i = (sheet.FirstRowNum); i <= 2900; i++) { NPOI.SS.UserModel.IRow row = null; try { row = sheet.GetRow(i); int ex = row.FirstCellNum; } catch (Exception) { continue; } DataRow dataRow = dt.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { try { if (row.GetCell(j) != null || row.GetCell(j).ToString() != "") //dataRow[j] = row.GetCell(j).ToString(); dataRow[j] = GetCellData(row, j); } catch (Exception ex) { string s = ex.ToString(); } } dt.Rows.Add(dataRow); } ds.Tables.Add(dt); listDs.Add(ds); } // if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString()); } return listDs; } public List GetSheetNames(IWorkbook workbook) { int x = workbook.NumberOfSheets; List sheetNames = new List(); for (int i = 0; i < x; i++) { sheetNames.Add(workbook.GetSheetName(i)); } return sheetNames; } public object GetCellData(IRow row, int column) { try { ICell hs = row.GetCell(column); NpoiDataType datatype = GetCellDataType(hs); //NpoiDataType.Blank; object obj = row.GetCell(column) ?? null; if (datatype == NpoiDataType.Datetime) { string v = ""; try { v = row.GetCell(column).StringCellValue; } catch (Exception e1) { v = row.GetCell(column).DateCellValue.ToString("yyyy-MM-dd hh:mm:ss"); } if (v != "") { try { obj = row.GetCell(column).DateCellValue.ToString("yyyy-MM-dd hh:mm:ss"); } catch (Exception e2) { obj = Convert.ToDateTime(v).ToString("yyyy-MM-dd hh:mm:ss"); } } else obj = DBNull.Value; } else if (datatype == NpoiDataType.Numeric) { obj = DBNull.Value; try { //if (row.GetCell(column).StringCellValue != "") obj = row.GetCell(column).NumericCellValue; } catch (Exception e3) { obj = row.GetCell(column).StringCellValue; } } else if (datatype == NpoiDataType.String && hs.CellType == CellType.Formula) { obj = row.GetCell(column).StringCellValue; } return obj; } catch (Exception e22) { return ""; } } #region 从DataSet导出到MemoryStream流2003 /// /// 从DataSet导出到MemoryStream流2003 /// /// 文件保存路径 /// Excel文件中的Sheet名称 /// 存储数据的DataSet /// 从哪一行开始写入,从0开始 /// DataSet中的各列对应的数据类型 public bool CreateExcel2003(string SaveFileName, string SheetName, DataSet ds, int startRow, params NpoiDataType[] datatypes) { try { if (startRow < 0) startRow = 0; HSSFWorkbook wb = new HSSFWorkbook(); wb = new HSSFWorkbook(); DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company = "pkm"; SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); si.Title = si.Subject = "automatic genereted document"; si.Author = "pkm"; wb.DocumentSummaryInformation = dsi; wb.SummaryInformation = si; ISheet sheet = wb.CreateSheet(SheetName); //sheet.SetColumnWidth(0, 50 * 256); //sheet.SetColumnWidth(1, 100 * 256); IRow row; ICell cell; DataRow dr; int j; int maxLength = 0; int curLength = 0; object columnValue; DataTable dt = ds.Tables[0]; if (datatypes.Length < dt.Columns.Count) { datatypes = new NpoiDataType[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { string dtcolumntype = dt.Columns[i].DataType.Name.ToLower(); switch (dtcolumntype) { case "string": datatypes[i] = NpoiDataType.String; break; case "datetime": datatypes[i] = NpoiDataType.Datetime; break; case "boolean": datatypes[i] = NpoiDataType.Bool; break; case "double": datatypes[i] = NpoiDataType.Numeric; break; default: datatypes[i] = NpoiDataType.String; break; } } } #region 创建表头 row = sheet.CreateRow(0);//创建第i行 ICellStyle style1 = wb.CreateCellStyle();//样式 IFont font1 = wb.CreateFont();//字体 font1.Color = HSSFColor.White.Index;//字体颜色 font1.Boldweight = (short)FontBoldWeight.Bold;//字体加粗样式 //style1.FillBackgroundColor = HSSFColor.WHITE.index;//GetXLColour(wb, LevelOneColor);// 设置图案色 style1.FillForegroundColor = HSSFColor.Green.Index;//GetXLColour(wb, LevelOneColor);// 设置背景色 style1.FillPattern = FillPattern.SolidForeground; style1.SetFont(font1);//样式里的字体设置具体的字体样式 style1.Alignment = HorizontalAlignment.Center;//文字水平对齐方式 style1.VerticalAlignment = VerticalAlignment.Center;//文字垂直对齐方式 row.HeightInPoints = 25; for (j = 0; j < dt.Columns.Count; j++) { columnValue = dt.Columns[j].ColumnName; curLength = Encoding.Default.GetByteCount(columnValue.ToString()); maxLength = (maxLength < curLength ? curLength : maxLength); int colounwidth = 256 * maxLength; sheet.SetColumnWidth(j, colounwidth); try { cell = row.CreateCell(j);//创建第0行的第j列 cell.CellStyle = style1;//单元格式设置样式 cell.SetCellType(CellType.String); cell.SetCellValue(columnValue.ToString()); } catch { continue; } } #endregion #region 创建每一行 for (int i = startRow; i < ds.Tables[0].Rows.Count; i++) { dr = ds.Tables[0].Rows[i]; row = sheet.CreateRow(i + 1);//创建第i行 for (j = 0; j < dt.Columns.Count; j++) { columnValue = dr[j]; curLength = Encoding.Default.GetByteCount(columnValue.ToString()); maxLength = (maxLength < curLength ? curLength : maxLength); int colounwidth = 256 * maxLength; sheet.SetColumnWidth(j, colounwidth); try { cell = row.CreateCell(j);//创建第i行的第j列 #region 插入第j列的数据 try { NpoiDataType dtype = datatypes[j]; switch (dtype) { case NpoiDataType.String: { cell.SetCellType(CellType.String); cell.SetCellValue(columnValue.ToString()); } break; case NpoiDataType.Datetime: { cell.SetCellType(CellType.String); cell.SetCellValue(columnValue.ToString()); } break; case NpoiDataType.Numeric: { cell.SetCellType(CellType.Numeric); cell.SetCellValue(Convert.ToDouble(columnValue)); } break; case NpoiDataType.Bool: { cell.SetCellType(CellType.Boolean); cell.SetCellValue(Convert.ToBoolean(columnValue)); } break; case NpoiDataType.Richtext: { cell.SetCellType(CellType.Formula); cell.SetCellValue(columnValue.ToString()); } break; } } catch { cell.SetCellType(CellType.String); cell.SetCellValue(columnValue.ToString()); } #endregion } catch { continue; } } } #endregion //using (FileStream fs = new FileStream(@SaveFileName, FileMode.OpenOrCreate))//生成文件在服务器上 //{ // wb.Write(fs); //} //string SaveFileName = "output.xls"; using (FileStream fs = new FileStream(@SaveFileName, FileMode.OpenOrCreate, FileAccess.Write))//生成文件在服务器上 { wb.Write(fs); Console.WriteLine("文件保存成功!" + SaveFileName); } return true; } catch (Exception er) { Console.WriteLine("文件保存成功!" + SaveFileName); return false; } } #endregion #region 从DataSet导出到MemoryStream流2007 /// /// 从DataSet导出到MemoryStream流2007 /// /// 文件保存路径 /// Excel文件中的Sheet名称 /// 存储数据的DataSet /// 从哪一行开始写入,从0开始 /// DataSet中的各列对应的数据类型 public bool CreateExcel2007(string SaveFileName, string SheetName, DataSet ds, int startRow, params NpoiDataType[] datatypes) { try { if (startRow < 0) startRow = 0; XSSFWorkbook wb = new XSSFWorkbook(); ISheet sheet = wb.CreateSheet(SheetName); //sheet.SetColumnWidth(0, 50 * 256); //sheet.SetColumnWidth(1, 100 * 256); IRow row; ICell cell; DataRow dr; int j; int maxLength = 0; int curLength = 0; object columnValue; DataTable dt = ds.Tables[0]; if (datatypes.Length < dt.Columns.Count) { datatypes = new NpoiDataType[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { string dtcolumntype = dt.Columns[i].DataType.Name.ToLower(); switch (dtcolumntype) { case "string": datatypes[i] = NpoiDataType.String; break; case "datetime": datatypes[i] = NpoiDataType.Datetime; break; case "boolean": datatypes[i] = NpoiDataType.Bool; break; case "double": datatypes[i] = NpoiDataType.Numeric; break; default: datatypes[i] = NpoiDataType.String; break; } } } #region 创建表头 row = sheet.CreateRow(0);//创建第i行 ICellStyle style1 = wb.CreateCellStyle();//样式 IFont font1 = wb.CreateFont();//字体 font1.Color = HSSFColor.White.Index;//字体颜色 font1.Boldweight = (short)FontBoldWeight.Bold;//字体加粗样式 //style1.FillBackgroundColor = HSSFColor.WHITE.index;//GetXLColour(wb, LevelOneColor);// 设置图案色 style1.FillForegroundColor = HSSFColor.Green.Index;//GetXLColour(wb, LevelOneColor);// 设置背景色 style1.FillPattern = FillPattern.SolidForeground; style1.SetFont(font1);//样式里的字体设置具体的字体样式 style1.Alignment = HorizontalAlignment.Center;//文字水平对齐方式 style1.VerticalAlignment = VerticalAlignment.Center;//文字垂直对齐方式 //row.HeightInPoints = 25; row.HeightInPoints = 15; for (j = 0; j < dt.Columns.Count; j++) { columnValue = dt.Columns[j].ColumnName; curLength = Encoding.Default.GetByteCount(columnValue.ToString()); maxLength = (maxLength < curLength ? curLength : maxLength); int colounwidth = 256 * maxLength; sheet.SetColumnWidth(j, colounwidth); try { cell = row.CreateCell(j);//创建第0行的第j列 cell.CellStyle = style1;//单元格式设置样式 //cell.SetCellType(CellType.STRING); cell.SetCellValue(columnValue.ToString()); } catch { continue; } } #endregion #region 创建每一行 for (int i = startRow; i < ds.Tables[0].Rows.Count; i++) { dr = ds.Tables[0].Rows[i]; row = sheet.CreateRow(i + 1);//创建第i行 for (j = 0; j < dt.Columns.Count; j++) { columnValue = dr[j]; curLength = Encoding.Default.GetByteCount(columnValue.ToString()); maxLength = (maxLength < curLength ? curLength : maxLength); //int colounwidth = 256 * maxLength; int colounwidth = 3000; sheet.SetColumnWidth(j, colounwidth); try { cell = row.CreateCell(j);//创建第i行的第j列 #region 插入第j列的数据 try { NpoiDataType dtype = datatypes[j]; switch (dtype) { case NpoiDataType.String: { //cell.SetCellType(CellType.STRING); cell.SetCellValue(columnValue.ToString()); } break; case NpoiDataType.Datetime: { // cell.SetCellType(CellType.STRING); cell.SetCellValue(columnValue.ToString()); } break; case NpoiDataType.Numeric: { //cell.SetCellType(CellType.NUMERIC); cell.SetCellValue(Convert.ToDouble(columnValue)); } break; case NpoiDataType.Bool: { //cell.SetCellType(CellType.BOOLEAN); cell.SetCellValue(Convert.ToBoolean(columnValue)); } break; case NpoiDataType.Richtext: { // cell.SetCellType(CellType.FORMULA); cell.SetCellValue(columnValue.ToString()); } break; } } catch { //cell.SetCellType(HSSFCell.CELL_TYPE_STRING); cell.SetCellValue(columnValue.ToString()); } #endregion } catch { continue; } } } #endregion //using (FileStream fs = new FileStream(@SaveFileName, FileMode.OpenOrCreate))//生成文件在服务器上 //{ // wb.Write(fs); //} //string SaveFileName = "output.xlsx"; using (FileStream fs = new FileStream(SaveFileName, FileMode.OpenOrCreate, FileAccess.Write))//生成文件在服务器上 { wb.Write(fs); Console.WriteLine("文件保存成功!" + SaveFileName); } return true; } catch (Exception er) { Console.WriteLine("文件保存失败!" + SaveFileName); return false; } } #endregion private short GetXLColour(HSSFWorkbook workbook, System.Drawing.Color SystemColour) { short s = 0; HSSFPalette XlPalette = workbook.GetCustomPalette(); HSSFColor XlColour = XlPalette.FindColor(SystemColour.R, SystemColour.G, SystemColour.B); if (XlColour == null) { if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 255) { if (NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE < 64) { //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE= 64; //NPOI.HSSF.Record.PaletteRecord.STANDARD_PALETTE_SIZE += 1; XlColour = XlPalette.AddColor(SystemColour.R, SystemColour.G, SystemColour.B); } else { XlColour = XlPalette.FindSimilarColor(SystemColour.R, SystemColour.G, SystemColour.B); } s = XlColour.Indexed; } } else s = XlColour.Indexed; return s; } #region 读Excel-根据NpoiDataType创建的DataTable列的数据类型 /// /// 读Excel-根据NpoiDataType创建的DataTable列的数据类型 /// /// /// private Type GetDataTableType(NpoiDataType datatype) { Type tp = typeof(string);//Type.GetType("System.String") switch (datatype) { case NpoiDataType.Bool: tp = typeof(bool); break; case NpoiDataType.Datetime: tp = typeof(DateTime); break; case NpoiDataType.Numeric: tp = typeof(double); break; case NpoiDataType.Error: tp = typeof(string); break; case NpoiDataType.Blank: tp = typeof(string); break; } return tp; } #endregion #region 读Excel-得到不同数据类型单元格的数据 /// /// 读Excel-得到不同数据类型单元格的数据 /// /// 数据类型 /// 数据中的一行 /// 哪列 /// private object GetCellData(NpoiDataType datatype, IRow row, int column) { var objcell = row.GetCell(column); object obj = objcell ?? null; if (obj == null) { return null; } if (obj.ToString().Contains("月") && obj.ToString().Contains("-") && objcell.DateCellValue != null) { datatype = NpoiDataType.Datetime; } else if (objcell.CellType == CellType.Numeric && (obj.ToString().Contains("-") || obj.ToString().Contains("/")) && objcell.DateCellValue != null) { datatype = NpoiDataType.Datetime; } if (datatype == NpoiDataType.Datetime) { string v = ""; try { v = row.GetCell(column).StringCellValue.Trim(); } catch (Exception e1) { v = row.GetCell(column).DateCellValue.ToString("yyyy-MM-dd hh:mm:ss"); } if (v != "") { try { obj = row.GetCell(column).DateCellValue.ToString("yyyy-MM-dd hh:mm:ss"); } catch (Exception e2) { obj = Convert.ToDateTime(v).ToString("yyyy-MM-dd hh:mm:ss"); } } else obj = DBNull.Value; } else if (datatype == NpoiDataType.Numeric) { obj = DBNull.Value; try { //if (row.GetCell(column).StringCellValue != "") obj = row.GetCell(column).NumericCellValue; } catch (Exception e3) { obj = row.GetCell(column).StringCellValue.Trim(); } } else { if (obj != null) { obj = obj.ToString().Trim().Replace("\n", "");//去掉回车,ligerui tree不支持回车 if (obj.ToString().StartsWith(".")) { decimal.Parse("0" + obj.ToString()); obj = "0" + obj.ToString(); } } } return obj; } private object GetCellData_double(NpoiDataType datatype, IRow row, int column) { return (object)(row.GetCell(column).NumericCellValue) ?? null; } #endregion #region 获取单元格数据类型 /// /// 获取单元格数据类型 /// /// /// private NpoiDataType GetCellDataType(ICell hs) { NpoiDataType dtype; DateTime t1; string cellvalue = ""; switch (hs.CellType) { case CellType.Blank: dtype = NpoiDataType.String; cellvalue = hs.StringCellValue; break; case CellType.Boolean: dtype = NpoiDataType.Bool; break; case CellType.Numeric: dtype = NpoiDataType.String; if (hs.NumericCellValue.ToString().Contains("-") || hs.NumericCellValue.ToString().Contains("/") || hs.ToString().Contains("-") || hs.ToString().Contains("/")) { hs.DateCellValue.ToString(); dtype = NpoiDataType.Datetime; } cellvalue = hs.NumericCellValue.ToString(); break; case CellType.String: dtype = NpoiDataType.String; cellvalue = hs.StringCellValue; break; case CellType.Error: dtype = NpoiDataType.Error; break; case CellType.Formula: { dtype = NpoiDataType.String; try { if (hs.CachedFormulaResultType == CellType.Numeric && hs.NumericCellValue.ToString() != "") { dtype = NpoiDataType.Numeric; cellvalue = hs.NumericCellValue.ToString(); } else if (hs.CachedFormulaResultType == CellType.Numeric && hs.DateCellValue.ToString() != "") { dtype = NpoiDataType.Datetime; cellvalue = hs.DateCellValue.ToString(); } else if (hs.RichStringCellValue.ToString() != "") { dtype = NpoiDataType.String; cellvalue = hs.RichStringCellValue.ToString(); } } catch { try { if (hs.CachedFormulaResultType == CellType.Numeric && hs.NumericCellValue.ToString() != "") { dtype = NpoiDataType.Numeric; cellvalue = hs.NumericCellValue.ToString(); } } catch { //cellvalue = hs.StringCellValue; } } break; } default: dtype = NpoiDataType.Datetime; break; } //if (cellvalue != "" && DateTime.TryParse(cellvalue, out t1)) dtype = NpoiDataType.Datetime; return dtype; } #endregion #region 测试代码 #endregion public DataSet ReadExcel_ByColNum(string FileName, int startRow, int LastCellNum, params NpoiDataType[] ColumnDataType) { string colNamePix = "F"; int ertime = 0; int intime = 0; DataSet ds = new DataSet("ds"); DataTable dt = new DataTable("dt"); DataRow dr; StringBuilder sb = new StringBuilder(); using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = WorkbookFactory.Create(stream);//使用接口,自动识别excel2003/2007格式 ISheet sheet = workbook.GetSheetAt(0);//得到里面第一个sheet int j; IRow row; #region ColumnDataType赋值 if (ColumnDataType.Length <= 0) { row = sheet.GetRow(startRow - 1);//得到第i行 ColumnDataType = new NpoiDataType[LastCellNum]; for (int i = 0; i < LastCellNum; i++) { ICell hs = row.GetCell(i, MissingCellPolicy.CREATE_NULL_AS_BLANK); ColumnDataType[i] = GetCellDataType(hs); //NpoiDataType.Blank; } } #endregion for (j = 0; j < ColumnDataType.Length; j++) { Type tp = GetDataTableType(ColumnDataType[j]); dt.Columns.Add(colNamePix + j, tp); } ReadExcelEndRow = ReadExcelEndRow == 0 ? sheet.PhysicalNumberOfRows : ReadExcelEndRow; int ss = sheet.LastRowNum + 1; if (ReadExcelEndRow < ss && ReadExcelEndRow > 0) { ReadExcelEndRow = ss; } for (int i = startRow - 1; i <= ReadExcelEndRow; i++) { row = sheet.GetRow(i);//得到第i行 if (row == null) continue; try { dr = dt.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) { dr[colNamePix + (j)] = GetCellData(ColumnDataType[j], row, j); } dt.Rows.Add(dr); intime++; } catch (Exception er) { ertime++; sb.Append(string.Format("第{0}行出错:{1}\r\n", i + 1, er.Message)); continue; } } ds.Tables.Add(dt); } if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString()); return ds; } } #region 枚举(Excel单元格数据类型) /// /// 枚举(Excel单元格数据类型) /// public enum NpoiDataType { /// /// 字符串类型-值为1 /// String, /// /// 布尔类型-值为2 /// Bool, /// /// 时间类型-值为3 /// Datetime, /// /// 数字类型-值为4 /// Numeric, /// /// 复杂文本类型-值为5 /// Richtext, /// /// 空白 /// Blank, /// /// 错误 /// Error } #endregion }