using System; using System.Collections.Generic; using NPOI; using NPOI.HPSF; using NPOI.HSSF; using NPOI.HSSF.UserModel; using NPOI.POIFS; using NPOI.Util; using System.Text; using System.IO; using System.Data; using System.Data.OleDb; using NPOI.SS.UserModel; namespace Business { public class CExcelOut { /// <summary>导出EXCEL表</summary> /// <param name="table">table表</param> /// <returns>二进制流</returns> public MemoryStream GetExecOut(DataTable table) { if (table == null) { return null; } List<DataTable> listTable = new List<DataTable>(); listTable.Add(table); return GetExecOut(listTable); } /// <summary>导入多个EXCEL表</summary> /// <param name="listTable">表集合</param> /// <returns>二进制流</returns> public MemoryStream GetExecOut(List<DataTable> listTable) { try { if (listTable == null || listTable.Count == 0) { return null; } Dictionary<string, DataTable> rowTable = new Dictionary<string, DataTable>(); for (int i = 0; i < listTable.Count; i++) { rowTable.Add("sheet" + (i + 1), listTable[i]); } return GetExecOut(rowTable); } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } /// <summary>导入多个EXCEL表 键是表名 值是table表</summary> /// <param name="listTable">键值对集合</param> /// <returns>二进制流</returns> public MemoryStream GetExecOut(Dictionary<string, DataTable> listTable) { if (listTable == null || listTable.Count == 0) { return null; } HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); try { foreach (KeyValuePair<string, DataTable> item in listTable) { string steerName = item.Key; //文件名 NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet(steerName); //头部 NPOI.SS.UserModel.IRow headerRow = sheet.CreateRow(0); foreach (DataColumn itemColumn in item.Value.Columns) { headerRow.CreateCell(itemColumn.Ordinal).SetCellValue(itemColumn.ColumnName); } int rowIndex = 1; foreach (DataRow itemRow in item.Value.Rows) { NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn itemColumn in item.Value.Columns) { dataRow.CreateCell(itemColumn.Ordinal). SetCellValue(itemRow[itemColumn.ColumnName].ToString()); } rowIndex++; } } workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } finally { workbook = null; } } /// <summary>把流转换为文件</summary> /// <param name="PathUrl">文件路径,如果文件存在则覆盖,不存在创建</param> /// <param name="ms">IO流</param> public void ExeclOut(string PathUrl, Stream ms) { try { if (PathUrl.Length == 0 || ms == null) { return; } FileStream file = new FileStream(PathUrl, FileMode.Create); if (ms.CanRead) { int lentgth = 4096; byte[] by = new byte[lentgth]; lentgth = ms.Read(by, 0, lentgth); while (lentgth != 0) { file.Write(by, 0, lentgth); lentgth = ms.Read(by, 0, lentgth); } file.Close(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } /// <summary>Excel表变成dataTable</summary> /// <param name="filePath">Excel表格路径</param> /// <param name="sheetName">查询表名</param> /// <returns>数据集合</returns> public DataTable GetTop1ExcelData(string filePath, string sheetName) { DataSet ds = new DataSet(); try { string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended properties=Excel 8.0;"; string sql = "select * from [" + sheetName + "$]"; using (OleDbConnection con = new OleDbConnection(connectionString)) { OleDbCommand cmd = new OleDbCommand(sql, con); OleDbDataAdapter adapt = new OleDbDataAdapter(cmd); adapt.Fill(ds); if (ds != null && ds.Tables.Count > 0) { return ds.Tables[0]; } return null; } } catch (Exception exp) { Console.WriteLine(exp.Message); return null; } } /// <summary>Excel表变成dataTable</summary> /// <param name="filePath">Excel表格路径</param> /// <param name="sheetName">查询表名</param> /// <returns>数据集合</returns> public DataTable GetExcelData(string filePath, string sheetName) { DataSet ds = new DataSet(); try { string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended properties='Excel 8.0;HDR=NO;IMEX=1'"; string sql = "select * from [" + sheetName + "$]"; using (OleDbConnection con = new OleDbConnection(connectionString)) { OleDbCommand cmd = new OleDbCommand(sql, con); OleDbDataAdapter adapt = new OleDbDataAdapter(cmd); adapt.Fill(ds); if (ds != null && ds.Tables.Count > 0) { return ds.Tables[0]; } return null; } } catch (Exception exp) { Console.WriteLine(exp.Message); return null; } } /// <summary> /// Excel表变成dataTable /// </summary> /// <param name="filePath">Excel表格路径</param> /// <returns>数据集合</returns> public DataTable GetExcelData(string filePath) { DataTable table = new DataTable(); try { FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileStream); ISheet iSheet = hssfWorkbook.GetSheetAt(0); if (iSheet != null) { IRow iRow = iSheet.GetRow(0); int cellCount = iRow.LastCellNum; for (int i = iRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(iRow.GetCell(i).StringCellValue); table.Columns.Add(column); } int rowCount = iSheet.LastRowNum; for (int i = (iSheet.FirstRowNum + 1); i < iSheet.LastRowNum; i++) { IRow row = iSheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) { dataRow[j] = row.GetCell(j).ToString(); } } table.Rows.Add(dataRow); } } fileStream.Flush(); fileStream.Dispose(); fileStream.Close(); fileStream = null; hssfWorkbook.Dispose(); hssfWorkbook = null; iSheet.Dispose(); iSheet = null; } catch (Exception exp) { } finally { } return table; } /// <summary> /// App设置导出Excel模板 /// </summary> /// <param name="tbData"></param> /// <param name="headTb"></param> /// <param name="steerName"></param> /// <returns></returns> public MemoryStream GetExecOut(DataTable tbData, DataTable headTb, string steerName) { if (tbData == null || tbData.Rows.Count == 0) { return null; } HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); try { //文件名 NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet(steerName); ICellStyle style = GetStyle(workbook); ICellStyle styleLeft = GetStyle(workbook, HorizontalAlignment.LEFT); ICellStyle styleSize = GetStyle(workbook, 11); int rowIndex = 0; //头部 NPOI.SS.UserModel.IRow headerRow = sheet.CreateRow(rowIndex); ICell cell = headerRow.CreateCell(0, CellType.STRING); cell.SetCellValue("分层标电子水准测量记录手簿"); cell.CellStyle = style; sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rowIndex, rowIndex, 0, 7)); //设置单元格的高度实际是设置其所在行高,所以要在单元格所在行上设置行高,行高设置数值好像是像素点的1/20,所以*20以便达到设置效果; //设置单元格的宽度实际上是设置其所在列宽,所以要在单元格所在列上设置(列的设置在工作表上),宽度数值好像是字符的1/256,所以*256以便达到设置效果。 for (int i = 0; i < 8; i++) { sheet.SetColumnWidth(i, 30 * 140); } headerRow.Height = 20 * 21; rowIndex++; foreach (DataRow itemRow in headTb.Rows) { headerRow = sheet.CreateRow(rowIndex); cell = headerRow.CreateCell(0, CellType.STRING); cell.SetCellValue(itemRow["Columns1"].ToString()); cell.CellStyle = style; cell = headerRow.CreateCell(1, CellType.STRING); cell.SetCellValue(itemRow["Columns2"].ToString()); cell.CellStyle = styleLeft; cell = headerRow.CreateCell(2, CellType.STRING); cell.CellStyle = style; cell = headerRow.CreateCell(3, CellType.STRING); cell.CellStyle = style; cell = headerRow.CreateCell(4, CellType.STRING); cell.SetCellValue(itemRow["Columns3"].ToString()); cell.CellStyle = style; cell = headerRow.CreateCell(5, CellType.STRING); cell.SetCellValue(itemRow["Columns4"].ToString()); cell.CellStyle = styleLeft; cell = headerRow.CreateCell(6, CellType.STRING); cell.CellStyle = style; cell = headerRow.CreateCell(7, CellType.STRING); cell.CellStyle = style; headerRow.Height = 20 * 21; //跨行 跨列 起始行 终止行 起始列 终止列 sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rowIndex, rowIndex, 1, 3)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(rowIndex, rowIndex, 5, 7)); rowIndex++; } NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(rowIndex); dataRow.Height = 20 * 22; sheet.SetColumnWidth(rowIndex, 30 * 140); cell = dataRow.CreateCell(0, CellType.STRING); cell.SetCellValue("测回编号"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(1, CellType.STRING); cell.SetCellValue("标点编号"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(2, CellType.STRING); cell.SetCellValue("中丝读数1"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(3, CellType.STRING); cell.SetCellValue("中丝读数2"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(4, CellType.STRING); cell.SetCellValue("中丝读数3"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(5, CellType.STRING); cell.SetCellValue("距离"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(6, CellType.STRING); cell.SetCellValue("中丝读数均值"); cell.CellStyle = styleSize; cell = dataRow.CreateCell(7, CellType.STRING); cell.SetCellValue("高差"); cell.CellStyle = styleSize; rowIndex++; foreach (DataRow itemRow in tbData.Rows) { dataRow = sheet.CreateRow(rowIndex); dataRow.Height = 20 * 22; foreach (DataColumn itemColumn in tbData.Columns) { dataRow.CreateCell(itemColumn.Ordinal, CellType.STRING).SetCellValue(itemRow[itemColumn.ColumnName].ToString()); dataRow.Cells[itemColumn.Ordinal].CellStyle = styleSize; } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } finally { workbook = null; } } /// <summary> /// App原始中间报表导出模板 /// </summary> /// <param name="tbData"></param> /// <returns></returns> public MemoryStream GetExcelOut(DataTable tbData) { if (tbData == null || tbData.Rows.Count == 0) { return null; } HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); try { //文件名 NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1"); ICellStyle style = GetStyle(workbook); ICellStyle styleSize = GetStyle(workbook, 11); int rowIndex = 0; //头部 NPOI.SS.UserModel.IRow headerRow = sheet.CreateRow(rowIndex); //设置单元格的高度实际是设置其所在行高,所以要在单元格所在行上设置行高,行高设置数值好像是像素点的1/20,所以*20以便达到设置效果; //设置单元格的宽度实际上是设置其所在列宽,所以要在单元格所在列上设置(列的设置在工作表上),宽度数值好像是字符的1/256,所以*256以便达到设置效果。 headerRow.Height = 20 * 21; foreach (DataColumn itemColumn in tbData.Columns) { ICell cell = headerRow.CreateCell(itemColumn.Ordinal, CellType.STRING); cell.SetCellValue(itemColumn.ColumnName); cell.CellStyle = style; //设置列宽度 sheet.SetColumnWidth(itemColumn.Ordinal, 30 * 160); } rowIndex++; foreach (DataRow itemRow in tbData.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); dataRow.Height = 20 * 22; foreach (DataColumn itemColumn in tbData.Columns) { dataRow.CreateCell(itemColumn.Ordinal, CellType.STRING).SetCellValue(itemRow[itemColumn.ColumnName].ToString()); dataRow.Cells[itemColumn.Ordinal].CellStyle = styleSize; } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; return ms; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } finally { workbook = null; } } /// <summary> /// 获取默认样式 /// </summary> /// <param name="workbook"></param> /// <returns></returns> public ICellStyle GetStyle(HSSFWorkbook workbook) { return GetStyle(workbook, 14, HorizontalAlignment.CENTER_SELECTION); } /// <summary> /// 获取样式 /// </summary> /// <param name="workbook"></param> /// <param name="size">设置字体大小</param> /// <returns></returns> public ICellStyle GetStyle(HSSFWorkbook workbook, short size) { return GetStyle(workbook, size, HorizontalAlignment.CENTER_SELECTION); } /// <summary> /// 获取样式 /// </summary> /// <param name="workbook"></param> /// <param name="ali">设置文本居中</param> /// <returns></returns> public ICellStyle GetStyle(HSSFWorkbook workbook, HorizontalAlignment ali) { return GetStyle(workbook, 14, ali); } /// <summary> /// 获取样式 /// </summary> /// <param name="workbook"></param> /// <param name="size">设置字体大小</param> /// <param name="ali">设置文本居中</param> /// <returns></returns> public ICellStyle GetStyle(HSSFWorkbook workbook, short size, HorizontalAlignment ali) { try { ICellStyle style = workbook.CreateCellStyle(); //居中 style.VerticalAlignment = VerticalAlignment.CENTER; //水平居中 style.Alignment = ali; //设置字体 IFont font = workbook.CreateFont(); font.FontName = "微软雅黑"; //设置大小 font.FontHeightInPoints = size; style.SetFont(font); return style; } catch (Exception ex) { return null; } } } }
NPOI.DLL下载地址 https://files.cnblogs.com/files/changeMe/NPOI.zip