using System.IO; using System.Data; using System; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.HSSF.Util; namespace UAS_LabelMachine { class ExcelHandler { DataHelper dh = new DataHelper(); /// /// 导出Excel,返回文件在客户端的路径 /// public string ExportExcel(DataTable dt, DataTable Captioon, string FolderPath, string FileName) { //创建一个内存流,用来接收转换成Excel的内容 MemoryStream ms; ms = DataTableToExcel(dt, Captioon); //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限 string filePath = @FolderPath + "\\" + FileName + ".xls"; FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write); byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); //释放当前Excel文件,否则打开文件的时候会显示文件被占用 ms.Dispose(); fs.Dispose(); return filePath; } /// /// 导入Excel /// public void ImportExcel(DataTable DataTable, string TableName) { int columnNum = DataTable.Columns.Count; int rowNum = DataTable.Columns.Count; string[] field = new string[columnNum]; for (int i = 0; i < columnNum; i++) { field[i] = DataTable.Rows[0][i].ToString(); } } /// /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件 /// /// /// public MemoryStream DataTableToExcel(DataTable DataTable, DataTable Captioon) { //创建内存流 MemoryStream ms = new MemoryStream(); //创建一个Book,相当于一个Excel文件 HSSFWorkbook book = new HSSFWorkbook(); //Excel中的Sheet ISheet sheet = book.CreateSheet("sheet1"); //获取行数量和列数量 int rowNum = DataTable.Rows.Count; int columnNum = DataTable.Columns.Count; //设置列的宽度,根据首行的列的内容的长度来设置 for (int i = 0; i < columnNum; i++) { int dataLength; //如果内容比标题短则取标题长度 if (DataTable.Rows[0][i].ToString().Length < DataTable.Columns[i].ColumnName.Length) { dataLength = DataTable.Columns[i].ColumnName.Length; dataLength = dataLength * 600; } else { dataLength = DataTable.Rows[0][i].ToString().Length; dataLength = dataLength * 500; } if (dataLength > 50000) dataLength = 50000; sheet.SetColumnWidth(i, dataLength); } ICellStyle style = book.CreateCellStyle(); style.FillForegroundColor = HSSFColor.PALE_BLUE.index; style.FillPattern = FillPatternType.BIG_SPOTS; style.FillBackgroundColor = HSSFColor.LIGHT_GREEN.index; //设置边框 style.BorderBottom = BorderStyle.THICK; style.BorderLeft = BorderStyle.THICK; style.BorderRight = BorderStyle.THICK; style.BorderTop = BorderStyle.THICK; //首先画好第一行带颜色的,单独写出来,避免写在循环里面 int rowindex = 0; if (Captioon.Rows[0]["es_engenable"].ToString() == "-1") { IRow row0 = sheet.CreateRow(rowindex); for (int i = 0; i < Captioon.Rows.Count; i++) { row0.CreateCell(i).SetCellValue(Captioon.Rows[i]["esd_engcaption"].ToString()); row0.Cells[i].CellStyle = style; row0.Cells[i].CellStyle.VerticalAlignment = VerticalAlignment.CENTER; row0.Cells[i].CellStyle.Alignment = HorizontalAlignment.CENTER; } rowindex = rowindex + 1; } if (Captioon.Rows[0]["es_chineseenable"].ToString() == "-1") { IRow row1 = sheet.CreateRow(rowindex); for (int i = 0; i < Captioon.Rows.Count; i++) { row1.CreateCell(i).SetCellValue(Captioon.Rows[i]["esd_caption"].ToString()); row1.Cells[i].CellStyle = style; row1.Cells[i].CellStyle.VerticalAlignment = VerticalAlignment.CENTER; row1.Cells[i].CellStyle.Alignment = HorizontalAlignment.CENTER; } rowindex = rowindex + 1; } //冻结第一行 sheet.CreateFreezePane(0, rowindex, 0, rowindex); IRow row = sheet.CreateRow(rowindex); row.HeightInPoints = 20; //将DataTable的值循环赋值给book,Aligment设置居中 //之前已经画了带颜色的第一行,所以从i=1开始画 for (int i = 0; i < rowNum; i++) { row = sheet.CreateRow(i + rowindex); row.HeightInPoints = 20; for (int j = 0; j < columnNum; j++) { row.CreateCell(j); row.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString()); row.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.CENTER; } } for (int i = 0; i < DataTable.Columns.Count; i++) { sheet.AutoSizeColumn(i); } //将book的内容写入内存流中返回 book.Write(ms); return ms; } } }