-
-
Save rscoopcur/79d15db0bbcdaef6714f329bc60a2c77 to your computer and use it in GitHub Desktop.
NPOIHelper.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| protected void btnExport_Click(object sender, EventArgs e) | |
| { | |
| try | |
| { | |
| string FileName = "Export"; | |
| DataTable dtExport = new DataTable(); | |
| NPOIHelper.ExportByWeb(dtExport, "", FileName + ".xls"); | |
| } | |
| catch (Exception ex) | |
| { | |
| Notify(ex.Message); | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| using System; | |
| using System.Collections.Generic; | |
| using System.Web; | |
| using System.IO; | |
| using System.Text; | |
| using System.Data; | |
| using NPOI; | |
| using NPOI.HPSF; | |
| using NPOI.HSSF; | |
| using NPOI.HSSF.UserModel; | |
| using NPOI.HSSF.Util; | |
| using NPOI.SS.Util; | |
| using NPOI.POIFS; | |
| using NPOI.Util; | |
| using NPOI.SS.UserModel; | |
| /// <summary> | |
| ///NPOI 的摘要说明 | |
| /// </summary> | |
| public class NPOIHelper | |
| { | |
| /// <summary> | |
| /// Export DataTable to Excel file | |
| /// </summary> | |
| /// <param name="dtSource">DataTable</param> | |
| /// <param name="strHeaderText">Header Text</param> | |
| /// <param name="strFileName">File Name</param> | |
| public static void Export(DataTable dtSource, string strHeaderText, string strFileName) | |
| { | |
| using (MemoryStream ms = Export(dtSource, strHeaderText)) | |
| { | |
| using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) | |
| { | |
| byte[] data = ms.ToArray(); | |
| fs.Write(data, 0, data.Length); | |
| fs.Flush(); | |
| } | |
| } | |
| } | |
| /// <summary> | |
| /// Export DataTable to Excel as a MemoryStream | |
| /// </summary> | |
| /// <param name="dtSource">DataTable</param> | |
| /// <param name="strHeaderText">Header Text</param> | |
| public static MemoryStream Export(DataTable dtSource, string strHeaderText) | |
| { | |
| HSSFWorkbook workbook = new HSSFWorkbook(); | |
| ISheet sheet = workbook.CreateSheet(); | |
| #region 右击文件 属性信息 | |
| { | |
| DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); | |
| dsi.Company = "NPOI"; | |
| workbook.DocumentSummaryInformation = dsi; | |
| SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); | |
| si.Author = "File author"; //fill in the author information of the xls file | |
| si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息 | |
| si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息 | |
| si.Comments = "作者信息"; //填加xls文件作者信息 | |
| si.Title = "标题信息"; //填加xls文件标题信息 | |
| si.Subject = "主题信息";//填加文件主题信息 | |
| si.CreateDateTime = DateTime.Now; | |
| workbook.SummaryInformation = si; | |
| } | |
| #endregion | |
| ICellStyle dateStyle = workbook.CreateCellStyle(); | |
| IDataFormat format = workbook.CreateDataFormat(); | |
| dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); | |
| //取得列宽 | |
| int[] arrColWidth = new int[dtSource.Columns.Count]; | |
| foreach (DataColumn item in dtSource.Columns) | |
| { | |
| arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; | |
| } | |
| for (int i = 0; i < dtSource.Rows.Count; i++) | |
| { | |
| for (int j = 0; j < dtSource.Columns.Count; j++) | |
| { | |
| int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length; | |
| if (intTemp > arrColWidth[j]) | |
| { | |
| arrColWidth[j] = intTemp; | |
| } | |
| } | |
| } | |
| int rowIndex = 0; | |
| foreach (DataRow row in dtSource.Rows) | |
| { | |
| #region 新建表,填充表头,填充列头,样式 | |
| if (rowIndex == 65535 || rowIndex == 0) | |
| { | |
| if (rowIndex != 0) | |
| { | |
| sheet = workbook.CreateSheet(); | |
| rowIndex = 0; | |
| } | |
| if (!string.IsNullOrEmpty(strHeaderText)) | |
| { | |
| #region 表头及样式 | |
| { | |
| IRow headerRow = sheet.CreateRow(0); | |
| headerRow.HeightInPoints = 25; | |
| headerRow.CreateCell(0).SetCellValue(strHeaderText); | |
| ICellStyle headStyle = workbook.CreateCellStyle(); | |
| headStyle.Alignment = HorizontalAlignment.Center; | |
| IFont font = workbook.CreateFont(); | |
| font.FontHeightInPoints = 20; | |
| font.Boldweight = 700; | |
| headStyle.SetFont(font); | |
| headerRow.GetCell(0).CellStyle = headStyle; | |
| sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); | |
| rowIndex++; | |
| } | |
| #endregion | |
| } | |
| #region 列头及样式 | |
| { | |
| IRow headerRow = sheet.CreateRow(rowIndex); | |
| ICellStyle headStyle = workbook.CreateCellStyle(); | |
| headStyle.Alignment = HorizontalAlignment.Center; | |
| IFont font = workbook.CreateFont(); | |
| font.FontHeightInPoints = 10; | |
| font.Boldweight = 700; | |
| headStyle.SetFont(font); | |
| foreach (DataColumn column in dtSource.Columns) | |
| { | |
| headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); | |
| headerRow.GetCell(column.Ordinal).CellStyle = headStyle; | |
| //设置列宽 | |
| sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256); | |
| } | |
| rowIndex++; | |
| } | |
| #endregion | |
| } | |
| #endregion | |
| #region 填充内容 | |
| IRow dataRow = sheet.CreateRow(rowIndex); | |
| foreach (DataColumn column in dtSource.Columns) | |
| { | |
| ICell newCell = dataRow.CreateCell(column.Ordinal); | |
| string drValue = row[column].ToString(); | |
| switch (column.DataType.ToString()) | |
| { | |
| case "System.String"://字符串类型 | |
| newCell.SetCellValue(drValue); | |
| break; | |
| case "System.DateTime"://日期类型 | |
| DateTime dateV; | |
| if (string.IsNullOrEmpty(drValue) || !DateTime.TryParse(drValue, out dateV)) | |
| newCell.SetCellValue(""); | |
| else | |
| { | |
| newCell.SetCellValue(dateV); | |
| newCell.CellStyle = dateStyle;//格式化显示 | |
| } | |
| break; | |
| case "System.Boolean"://布尔型 | |
| bool boolV = false; | |
| bool.TryParse(drValue, out boolV); | |
| newCell.SetCellValue(boolV); | |
| break; | |
| case "System.Int16"://整型 | |
| case "System.Int32": | |
| case "System.Int64": | |
| case "System.Byte": | |
| int intV = 0; | |
| int.TryParse(drValue, out intV); | |
| newCell.SetCellValue(intV); | |
| break; | |
| case "System.Decimal"://浮点型 | |
| case "System.Double": | |
| double doubV = 0; | |
| double.TryParse(drValue, out doubV); | |
| newCell.SetCellValue(doubV); | |
| break; | |
| case "System.DBNull"://空值处理 | |
| newCell.SetCellValue(""); | |
| break; | |
| default: | |
| newCell.SetCellValue(""); | |
| break; | |
| } | |
| } | |
| #endregion | |
| rowIndex++; | |
| } | |
| using (MemoryStream ms = new MemoryStream()) | |
| { | |
| workbook.Write(ms); | |
| ms.Flush(); | |
| ms.Position = 0; | |
| //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet | |
| return ms; | |
| } | |
| } | |
| /// <summary> | |
| /// 用于Web导出 | |
| /// </summary> | |
| /// <param name="dtSource">源DataTable</param> | |
| /// <param name="strHeaderText">表头文本</param> | |
| /// <param name="strFileName">文件名</param> | |
| public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName) | |
| { | |
| HttpContext curContext = HttpContext.Current; | |
| // 设置编码和附件格式 | |
| curContext.Response.ContentType = "application/ms-excel"; | |
| curContext.Response.ContentEncoding = Encoding.UTF8; | |
| curContext.Response.Charset = "UTF-8"; | |
| curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName); | |
| curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer()); | |
| curContext.Response.End(); | |
| } | |
| /// <summary>读取excel | |
| /// 默认第一行为标头 | |
| /// </summary> | |
| /// <param name="strFileName">excel文档路径</param> | |
| /// <returns></returns> | |
| public static DataTable Import(string strFileName) | |
| { | |
| DataTable dt = new DataTable(); | |
| IWorkbook workbook = null; | |
| string fileExt = Path.GetExtension(strFileName); | |
| using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) | |
| { | |
| if (fileExt == ".xls") workbook = new HSSFWorkbook(file); | |
| else if (fileExt == ".xlsx") workbook = new NPOI.XSSF.UserModel.XSSFWorkbook(file); | |
| else throw (new Exception("未能识别Excel格式")); | |
| } | |
| ISheet sheet = workbook.GetSheetAt(0); | |
| System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); | |
| IRow headerRow = sheet.GetRow(0); | |
| int cellCount = headerRow.LastCellNum; | |
| for (int j = 0; j < cellCount; j++) | |
| { | |
| ICell cell = headerRow.GetCell(j); | |
| dt.Columns.Add(cell.ToString()); | |
| } | |
| for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) | |
| { | |
| IRow row = sheet.GetRow(i); | |
| DataRow dataRow = dt.NewRow(); | |
| if (row == null) continue; | |
| for (int j = row.FirstCellNum; j < cellCount; j++) | |
| { | |
| if (row.GetCell(j) != null) | |
| dataRow[j] = row.GetCell(j).ToString(); | |
| } | |
| dt.Rows.Add(dataRow); | |
| } | |
| return dt; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment