using NPOI.XSSF.UserModel; using NPOI.HSSF.UserModel; using NPOI.HPSF; using NPOI.POIFS.FileSystem; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Web; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Windows; using System.Data.OleDb; namespace HiiShe.Manager { public class ExcelHelper { private string fileName = null; //文件名 private IWorkbook workbook = null; private FileStream fs = null; private bool disposed; public ExcelHelper(string fileName) { this.fileName = fileName; disposed = false; } public ExcelHelper() { } #region NPOI DataGridView 导出 EXCEL /// /// NPOI DataGridView 导出 EXCEL /// /// 默认保存文件名 /// DataGridView /// 字体名称 /// 字体大小 public static void ExportExcel(string fileName, string fontname = "宋体", short fontsize = 10,params DataTable[] arraydgv) { int g = 0; HSSFWorkbook workbook = new HSSFWorkbook(); foreach (DataTable dgv in arraydgv) { g++; //检测是否有数据 //if (dgv.Rows.Count == 0) // continue ; //创建主要对象 HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet("Sheet"+g.ToString()); //设置字体,大小,对齐方式 HSSFCellStyle style = (HSSFCellStyle)workbook.CreateCellStyle(); HSSFFont font = (HSSFFont)workbook.CreateFont(); font.FontName = fontname; font.FontHeightInPoints = fontsize; style.SetFont(font); style.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //居中对齐 //添加表头 HSSFRow dataRow = (HSSFRow)sheet.CreateRow(0); for (int i = 0; i < dgv.Columns.Count; i++) { dataRow.CreateCell(i).SetCellValue(dgv.Columns[i].ColumnName); dataRow.GetCell(i).CellStyle = style; } //注释的这行是设置筛选的 //sheet.SetAutoFilter(new CellRangeAddress(0, dgv.Columns.Count, 0, dgv.Columns.Count)); //添加列及内容 for (int i = 0; i < dgv.Rows.Count; i++) { dataRow = (HSSFRow)sheet.CreateRow(i + 1); for (int j = 0; j < dgv.Columns.Count; j++) { string ValueType = dgv.Rows[i][j].GetType().ToString(); string Value = dgv.Rows[i][j].ToString(); switch (ValueType) { case "System.DateTime"://日期类型 //System.DateTime dateV; //System.DateTime.TryParse(Value, out dateV); //dataRow.CreateCell(j).SetCellValue(dateV); ////break; case "System.String"://字符串类型 dataRow.CreateCell(j).SetCellValue(Value); break; case "System.Boolean"://布尔型 bool boolV = false; bool.TryParse(Value, out boolV); dataRow.CreateCell(j).SetCellValue(boolV); break; case "System.Int16"://整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(Value, out intV); dataRow.CreateCell(j).SetCellValue(intV); break; case "System.Decimal"://浮点型 case "System.Double": double doubV = 0; double.TryParse(Value, out doubV); dataRow.CreateCell(j).SetCellValue(doubV); break; case "System.DBNull"://空值处理 dataRow.CreateCell(j).SetCellValue(""); break; default: dataRow.CreateCell(j).SetCellValue(""); break; } dataRow.GetCell(j).CellStyle = style; //设置宽度 sheet.SetColumnWidth(j, (Value.Length + 10) * 256); } } } //保存文件 string saveFileName = ""; SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.DefaultExt = "qrdata"; saveDialog.Filter = "牵软网络交互文件|*.qrdata"; saveDialog.FileName = fileName; MemoryStream ms = new MemoryStream(); if (saveDialog.ShowDialog() ==true) { saveFileName = saveDialog.FileName; if (!CheckFiles(saveFileName)) { MessageBox.Show("文件被占用,请关闭文件 " + saveFileName); workbook = null; ms.Close(); ms.Dispose(); return; } workbook.Write(ms); FileStream file = new FileStream(saveFileName.Replace(".xls",".qrdata"), FileMode.Create); workbook.Write(file); file.Close(); workbook = null; ms.Close(); ms.Dispose(); MessageBox.Show(fileName + " 保存成功", "提示"); } else { workbook = null; ms.Close(); ms.Dispose(); } } #endregion #region 检测文件被占用 [DllImport("kernel32.dll")] public static extern IntPtr _lopen(string lpPathName, int iReadWrite); [DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr hObject); public const int OF_READWRITE = 2; public const int OF_SHARE_DENY_NONE = 0x40; public readonly IntPtr HFILE_ERROR = new IntPtr(-1); /// /// 检测文件被占用 /// /// 要检测的文件路径 /// public static bool CheckFiles(string FileNames) { if (!File.Exists(FileNames)) { //文件不存在 return true; } IntPtr vHandle = _lopen(FileNames, OF_READWRITE | OF_SHARE_DENY_NONE); //if (vHandle == HFILE_ERROR) //{ // //文件被占用 // return false; //} //文件没被占用 CloseHandle(vHandle); return true; } #endregion public static void ToExcel(MemoryStream ms, string strFileName) { } public static void RenderToExcel(string strFileName, DataTable table) { MemoryStream ms = new MemoryStream(); using (table) { IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(); IRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in table.Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value // handling value. int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; } } public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn) { ISheet sheet = null; DataTable data = new DataTable(); int startRow = 0; try { fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); //if (fileName.IndexOf(".xlsx") > 0) // 2007版本 // workbook = new XSSFWorkbook(fs); //else if (fileName.IndexOf(".xls") > 0) // 2003版本 // workbook = new HSSFWorkbook(fs); try { workbook = new XSSFWorkbook(fs); } catch { workbook = new HSSFWorkbook(fs); } if (sheetName != null) { sheet = workbook.GetSheet(sheetName); if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet { sheet = workbook.GetSheetAt(0); } } else { sheet = workbook.GetSheetAt(0); } if (sheet != null) { IRow firstRow = sheet.GetRow(0); int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue); data.Columns.Add(column); } } } startRow = sheet.FirstRowNum + 1; } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { IRow row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null        DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null dataRow[j] = row.GetCell(j).ToString(); } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { throw ex; } } public static DataTable DataEncryption(DataTable arrayData) { DataTable CloneData = new DataTable(); foreach (DataColumn dc in arrayData.Columns) { CloneData.Columns.Add(dc.ColumnName.ToDecrypt(), typeof(string)); } for (int i = 0; i < arrayData.Rows.Count; i++) { CloneData.Rows.Add(); for (int j = 0; j < arrayData.Columns.Count; j++) { if (CloneData.Columns[j].ColumnName != "PROWERRIGHT") { CloneData.Rows[i][j] = arrayData.Rows[i][j].ToString().ToDecrypt(); } } } return CloneData; } public String[] GetExcelSheetNames(string excelFile) { OleDbConnection objConn = null; System.Data.DataTable dt = null; try { String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";Extended Properties=Excel 8.0;"; objConn = new OleDbConnection(connString); objConn.Open(); dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new Object[] { null, null, null, "TABLE" }); if (dt == null) { return null; } String[] excelSheets = new String[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { excelSheets[i] = dt.Rows[i][2].ToString().Replace("$", ""); } //int sheetsCounter = dt.Rows.Count; return excelSheets; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } finally { if (objConn != null) { objConn.Close(); objConn.Dispose(); } if (dt != null) { dt.Dispose(); } } } } }