|
|
@@ -0,0 +1,242 @@
|
|
|
+using System.IO;
|
|
|
+using System.Data;
|
|
|
+using System;
|
|
|
+using NPOI.HSSF.UserModel;
|
|
|
+using NPOI.SS.UserModel;
|
|
|
+using NPOI.HSSF.Util;
|
|
|
+using NPOI.SS.Formula.Eval;
|
|
|
+using System.Text;
|
|
|
+
|
|
|
+namespace Check.DataOperate
|
|
|
+{
|
|
|
+ class ExcelHandler
|
|
|
+ {
|
|
|
+ DataHelper dh = new DataHelper();
|
|
|
+ /// <summary>
|
|
|
+ /// 导出Excel,返回文件在客户端的路径
|
|
|
+ /// </summary>
|
|
|
+ public string ExportExcel(DataTable dt, string FolderPath)
|
|
|
+ {
|
|
|
+ //创建一个内存流,用来接收转换成Excel的内容
|
|
|
+ MemoryStream ms;
|
|
|
+ ms = DataTableToExcel(dt);
|
|
|
+ //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限
|
|
|
+ string filePath = @FolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 导入Excel
|
|
|
+ /// </summary>
|
|
|
+ public DataTable ImportExcel(string FolderPath, string TableName)
|
|
|
+ {
|
|
|
+ DataTable dt = new DataTable();
|
|
|
+ dt.TableName = TableName;
|
|
|
+ if (FolderPath.Contains(".xls") || FolderPath.Contains(".xlsx"))
|
|
|
+ {
|
|
|
+ using (FileStream file = new FileStream(FolderPath, FileMode.Open, FileAccess.Read))
|
|
|
+ {
|
|
|
+ //获取文件流
|
|
|
+ HSSFWorkbook workbook = new HSSFWorkbook(file);
|
|
|
+ ISheet sheet = workbook.GetSheetAt(0);
|
|
|
+ //获取所有的列名
|
|
|
+ foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells)
|
|
|
+ {
|
|
|
+ dt.Columns.Add(item.ToString(), typeof(string));
|
|
|
+ }
|
|
|
+
|
|
|
+ System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
|
|
|
+ while (rows.MoveNext())
|
|
|
+ {
|
|
|
+ IRow row = (HSSFRow)rows.Current;
|
|
|
+ if (row.RowNum == sheet.FirstRowNum)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ DataRow dr = dt.NewRow();
|
|
|
+ foreach (ICell item in row.Cells)
|
|
|
+ {
|
|
|
+ switch (item.CellType)
|
|
|
+ {
|
|
|
+ case CellType.BOOLEAN:
|
|
|
+ dr[item.ColumnIndex] = item.BooleanCellValue;
|
|
|
+ break;
|
|
|
+ case CellType.ERROR:
|
|
|
+ dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
|
|
|
+ break;
|
|
|
+ case CellType.FORMULA:
|
|
|
+ switch (item.CachedFormulaResultType)
|
|
|
+ {
|
|
|
+ case CellType.BOOLEAN:
|
|
|
+ dr[item.ColumnIndex] = item.BooleanCellValue;
|
|
|
+ break;
|
|
|
+ case CellType.ERROR:
|
|
|
+ dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
|
|
|
+ break;
|
|
|
+ case CellType.NUMERIC:
|
|
|
+ if (DateUtil.IsCellDateFormatted(item))
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = item.NumericCellValue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CellType.STRING:
|
|
|
+ string str = item.StringCellValue;
|
|
|
+ if (!string.IsNullOrEmpty(str))
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = str.ToString();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = null;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CellType.Unknown:
|
|
|
+ case CellType.BLANK:
|
|
|
+ default:
|
|
|
+ dr[item.ColumnIndex] = string.Empty;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CellType.NUMERIC:
|
|
|
+ if (DateUtil.IsCellDateFormatted(item))
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd hh:MM:ss");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = item.NumericCellValue;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CellType.STRING:
|
|
|
+ string strValue = item.StringCellValue;
|
|
|
+ if (string.IsNullOrEmpty(strValue))
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = strValue.ToString();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dr[item.ColumnIndex] = null;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case CellType.Unknown:
|
|
|
+ case CellType.BLANK:
|
|
|
+ default:
|
|
|
+ dr[item.ColumnIndex] = string.Empty;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dt.Rows.Add(dr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dt;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void WriteTxt(DataTable dt, string FolderPath, string FileName)
|
|
|
+ {
|
|
|
+ StreamWriter sr;
|
|
|
+ string filePath = @FolderPath;
|
|
|
+ string report;
|
|
|
+ if (File.Exists(filePath + "\\" + FileName)) //如果文件存在,则创建File.AppendText对象
|
|
|
+ {
|
|
|
+ File.Delete(filePath + "\\" + FileName);
|
|
|
+ }
|
|
|
+ sr = File.CreateText(filePath + "\\" + FileName);
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ string Title = "";
|
|
|
+ foreach (DataColumn dc in dt.Columns)
|
|
|
+ {
|
|
|
+ Title += String.Format("{0,10}", dc.ColumnName.ToString());
|
|
|
+ }
|
|
|
+ sr.WriteLine(Title + "\r");
|
|
|
+ foreach (DataRow dr in dt.Rows)
|
|
|
+ {
|
|
|
+ string text = "";
|
|
|
+ for (int i = 0; i < dt.Columns.Count; i++)
|
|
|
+ {
|
|
|
+ text += String.Format("{0,10}", dr[i].ToString());
|
|
|
+ }
|
|
|
+ sr.WriteLine(text + "\r");
|
|
|
+ }
|
|
|
+ sr.Close();
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="DataTable"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ public MemoryStream DataTableToExcel(DataTable DataTable)
|
|
|
+ {
|
|
|
+ //创建内存流
|
|
|
+ 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 = DataTable.Columns[i].ColumnName.Length;
|
|
|
+ sheet.SetColumnWidth(i, dataLength * 700);
|
|
|
+ }
|
|
|
+ //首先画好第一行带颜色的,单独写出来,避免写在循环里面
|
|
|
+ IRow row = sheet.CreateRow(0);
|
|
|
+ //冻结第一行
|
|
|
+ sheet.CreateFreezePane(0, 1, 0, 1);
|
|
|
+ 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;
|
|
|
+ row.HeightInPoints = 20;
|
|
|
+ //固定第一行
|
|
|
+ //row.RowStyle.IsLocked=true;
|
|
|
+ //给第一行的标签赋值样式和值
|
|
|
+ for (int j = 0; j < columnNum; j++)
|
|
|
+ {
|
|
|
+ row.CreateCell(j);
|
|
|
+ row.Cells[j].CellStyle = style;
|
|
|
+ row.Cells[j].CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
|
|
|
+ row.Cells[j].CellStyle.Alignment = HorizontalAlignment.CENTER;
|
|
|
+ row.Cells[j].SetCellValue(DataTable.Columns[j].ColumnName);
|
|
|
+ }
|
|
|
+
|
|
|
+ //将DataTable的值循环赋值给book,Aligment设置居中
|
|
|
+ //之前已经画了带颜色的第一行,所以从i=1开始画
|
|
|
+ for (int i = 0; i < rowNum; i++)
|
|
|
+ {
|
|
|
+ IRow row1 = sheet.CreateRow(i + 1);
|
|
|
+ row1.HeightInPoints = 20;
|
|
|
+ for (int j = 0; j < columnNum; j++)
|
|
|
+ {
|
|
|
+ row1.CreateCell(j);
|
|
|
+ row1.Cells[j].SetCellValue(DataTable.Rows[i][j].ToString());
|
|
|
+ row1.GetCell(j).CellStyle.VerticalAlignment = VerticalAlignment.CENTER;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //将book的内容写入内存流中返回
|
|
|
+ book.Write(ms);
|
|
|
+ return ms;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|