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 UAS_MES_NEW.DataOperate { class ExcelHandler { DataHelper dh = new DataHelper(); /// /// 导出Excel,返回文件在客户端的路径 /// 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; } public string ExportExcel(DataTable dt, string FolderPath,string location) { //创建一个内存流,用来接收转换成Excel的内容 MemoryStream ms; ms = DataTableToExcel(dt); //以系统当前时间命名文件,FileMode.Create表示创建文件,FileAccess.Write表示拥有写的权限 string filePath = @FolderPath + "\\" + DateTime.Now.ToString("yyyyMMddHHmmss") +location+ ".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 DataTable ImportExcel(string FolderPath, string TableName) { DataTable dt = new DataTable(); dt.TableName = TableName; if (FolderPath.Contains(".xls") || FolderPath.Contains(".xlsx")|| 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().Trim(), 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); } } } if (FolderPath.Contains(".csv")) { dt = ReadFromCSV(FolderPath); } return dt; } /// /// 将CSV文件中内容读取到DataTable中 /// /// CSV文件路径 /// 是否将CSV文件的第一行读取为DataTable的列名 /// public static DataTable ReadFromCSV(string path, bool hasTitle = true) { DataTable dt = new DataTable(); //要输出的数据表 StreamReader sr = new StreamReader(path, System.Text.Encoding.GetEncoding("GB2312")); //文件读入流 bool bFirst = true; //指示是否第一次读取数据 //逐行读取 string line; while ((line = sr.ReadLine()) != null) { string[] elements = line.Replace("\r", "").Replace("\n", "").Replace("\t", "").Split(','); //第一次读取数据时,要创建数据列 if (bFirst) { for (int i = 0; i < elements.Length; i++) { dt.Columns.Add(); } bFirst = false; } //有标题行时,第一行当做标题行处理 if (hasTitle) { for (int i = 0; i < dt.Columns.Count && i < elements.Length; i++) { dt.Columns[i].ColumnName = elements[i]; } hasTitle = false; } else //读取一行数据 { if (elements.Length == dt.Columns.Count) { dt.Rows.Add(elements); } else { //throw new Exception("CSV格式错误:表格各行列数不一致"); } } } sr.Close(); return dt; } public void WriteTxt(DataTable dt, string FolderPath, string FileName) { StreamWriter sr; string filePath = @FolderPath; 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(); } /// /// 将DataTable形式的数据转成Excel格式的,然后用字节流的形式写入文件 /// /// /// 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; } } }