using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Web; using Microsoft.Office.Interop.Word; using NPOI; using NPOI.HPSF; using NPOI.HSSF; using NPOI.HSSF.UserModel; using NPOI.HSSF.Util; using NPOI.POIFS; using NPOI.Util; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; using DataTable = System.Data.DataTable; using IFont = NPOI.SS.UserModel.IFont; namespace CommonHelper { /// /// NPOI操作帮助类 /// public class NPOIHelper { public static readonly string SheetLockPassword = Configs.GetValue("ExcelTemplatePsw"); /// /// DataTable导出到Excel文件 /// /// /// public static void ExportExcel(DataTable dt, string file) { IWorkbook workbook; string fileExt = Path.GetExtension(file).ToLower(); if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } if (workbook == null) { return; } ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); //表头 IRow row = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = row.CreateCell(i); cell.SetCellValue(dt.Columns[i].ColumnName); } //数据 for (int i = 0; i < dt.Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Columns.Count; j++) { ICell cell = row1.CreateCell(j); cell.SetCellValue(dt.Rows[i][j].ToString()); } } //转为字节数组 MemoryStream stream = new MemoryStream(); workbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } /// /// 公司导出到Excel文件 /// /// /// public static void ExportExcelCompany(DataSet dt, string file) { IWorkbook workbook; string fileExt = Path.GetExtension(file).ToLower(); if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } if (workbook == null) { return; } for (int z = 0; z < dt.Tables.Count; z++) { ISheet sheet = string.IsNullOrEmpty(dt.Tables[z].TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.Tables[z].TableName); //表头 IRow row = sheet.CreateRow(0); for (int i = 0; i < dt.Tables[z].Columns.Count; i++) { ICell cell = row.CreateCell(i); cell.SetCellValue(dt.Tables[z].Columns[i].ColumnName); } //数据 for (int i = 0; i < dt.Tables[z].Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); for (int j = 0; j < dt.Tables[z].Columns.Count; j++) { ICell cell = row1.CreateCell(j); cell.SetCellValue(dt.Tables[z].Rows[i][j].ToString()); } } } //转为字节数组 MemoryStream stream = new MemoryStream(); workbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } /// /// DataTable导出到Excel文件 /// /// /// public static void FRMExportExcel(DataTable dt, string file, string title, bool IsShow) { if (IsShow) { IWorkbook workbook; string fileExt = Path.GetExtension(file).ToLower(); if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } if (workbook == null) { return; } ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); //表头 IRow row = sheet.CreateRow(0); row.Height = 25 * 20; //行高为30 // sheet.SetColumnWidth(0, 13 * 256); CellRangeAddress region = new CellRangeAddress(0, 0, 0, dt.Columns.Count - 1); sheet.SetColumnWidth(0, 30 * 256); sheet.AddMergedRegion(region); #region 标题样式 ICellStyle style = workbook.CreateCellStyle();//创建样式对象 IFont font = workbook.CreateFont(); //创建一个字体样式对象 font.FontName = "微软雅黑"; //和excel里面的字体对应 // font.Color = new HSSFColor.Pink().GetIndex();//颜色参考NPOI的颜色对照表(替换掉PINK()) font.IsItalic = false; //斜体 font.FontHeightInPoints = 14;//字体大小 font.Boldweight = short.MaxValue;//字体加粗 style.SetFont(font); //将字体样式赋给样式对象 style.BorderTop = BorderStyle.Thin; style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.WrapText = true;//设置自动换行 style.Alignment = HorizontalAlignment.Center; #endregion #region 内容样式 1 右对齐 千位符保留两位小数 ICellStyle style1 = workbook.CreateCellStyle(); IFont font1 = workbook.CreateFont(); var format1 = workbook.CreateDataFormat(); font1.FontName = "微软雅黑"; font1.IsItalic = false; font1.FontHeightInPoints = 12; font1.Boldweight = short.MaxValue; style1.SetFont(font1); style1.DataFormat = format1.GetFormat("#,##0.00"); style1.BorderTop = BorderStyle.Thin; style1.BorderBottom = BorderStyle.Thin; style1.BorderLeft = BorderStyle.Thin; style1.BorderRight = BorderStyle.Thin; style1.WrapText = true;//设置自动换行 style1.Alignment = HorizontalAlignment.Right; #endregion #region 内容样式2 左对齐 ICellStyle style2 = workbook.CreateCellStyle(); IFont font2 = workbook.CreateFont(); font2.FontName = "微软雅黑"; font2.IsItalic = false; font2.FontHeightInPoints = 12; font2.Boldweight = short.MaxValue; style2.SetFont(font2); style2.BorderTop = BorderStyle.Thin; style2.BorderBottom = BorderStyle.Thin; style2.BorderLeft = BorderStyle.Thin; style2.BorderRight = BorderStyle.Thin; style2.WrapText = true; style2.Alignment = HorizontalAlignment.Left; #endregion #region 内容样式3 左对齐 加粗 ICellStyle style3 = workbook.CreateCellStyle(); IFont font3 = workbook.CreateFont(); font3.FontName = "微软雅黑"; font3.IsItalic = false; font3.FontHeightInPoints = 12; font3.Boldweight = (short)FontBoldWeight.Bold; style3.SetFont(font3); style3.BorderTop = BorderStyle.Thin; style3.BorderBottom = BorderStyle.Thin; style3.BorderLeft = BorderStyle.Thin; style3.BorderRight = BorderStyle.Thin; style3.WrapText = true; style3.Alignment = HorizontalAlignment.Left; #endregion #region 内容样式4 右对齐 加粗 千位符 保留两位小数 ICellStyle style4 = workbook.CreateCellStyle(); IFont font4 = workbook.CreateFont(); var format4 = workbook.CreateDataFormat(); font4.FontName = "微软雅黑"; font4.IsItalic = false; font4.FontHeightInPoints = 12; font4.Boldweight = (short)FontBoldWeight.Bold; style4.SetFont(font4); style4.DataFormat = format4.GetFormat("#,##0.00"); style4.BorderTop = BorderStyle.Thin; style4.BorderBottom = BorderStyle.Thin; style4.BorderLeft = BorderStyle.Thin; style4.BorderRight = BorderStyle.Thin; style4.WrapText = true; style4.Alignment = HorizontalAlignment.Right; #endregion #region 内容样式 5 右对齐 ICellStyle style5 = workbook.CreateCellStyle(); IFont font5 = workbook.CreateFont(); font5.FontName = "微软雅黑"; font5.IsItalic = false; font5.FontHeightInPoints = 12; font5.Boldweight = short.MaxValue; style5.SetFont(font5); style5.BorderTop = BorderStyle.Thin; style5.BorderBottom = BorderStyle.Thin; style5.BorderLeft = BorderStyle.Thin; style5.BorderRight = BorderStyle.Thin; style5.WrapText = true;//设置自动换行 style5.Alignment = HorizontalAlignment.Right; #endregion ICell cellt = row.CreateCell(0); cellt.CellStyle = style; //把样式赋给单元格 cellt.SetCellValue(title); //数据 for (int i = 0; i < dt.Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); if (row1 == null) { continue; } int OldHg = row1.Height; for (int z = 0; z < dt.Columns.Count; z++) { if (row1.GetCell(z) == null) { continue; } ICell CurCell = row1.GetCell(z); if (CurCell.CellType == NPOI.SS.UserModel.CellType.String && CurCell.StringCellValue != string.Empty) { double CurHeight = row1.Sheet.GetColumnWidth(CurCell.ColumnIndex) / 277; double length = Encoding.Default.GetBytes(CurCell.ToString()).Length; short height = Convert.ToInt16(Math.Ceiling(length / CurHeight)); if (height * 256 > OldHg) { OldHg = height * 256; } } } if (row1.Height < OldHg) { row1.Height = Convert.ToInt16(OldHg); } sheet.SetColumnWidth(i + 1, 25 * 256); bool FontFlag = false; //row1.Height = 36 * 20; for (int j = 0; j < dt.Columns.Count; j++) { dt.Rows[i][j] = dt.Rows[i][j].ToString().Replace("wqeewqsdad", "").Replace("--------", "*").Replace("木部", "本部").Replace("贷币", "货币"); if (i == 0) { if (dt.Rows[i][j].ToString() == "" || dt.Rows[i][j].ToString().Length > 5) { if (j == 0) { dt.Rows[i][j] = "项目"; } } } if (dt.Columns.Count == 4 && i == 0) { if (dt.Rows[i][j].ToString() == "") { if (j == 0) { dt.Rows[i][j] = "项目"; } if (j == 2) { dt.Rows[i][j] = "本年金额"; } if (j == 3) { dt.Rows[i][j] = "上年金额"; } } } ICell cell = row1.CreateCell(j); if (j == 0) { if ((dt.Rows[i][j].ToString().Contains("流动资产") && dt.Rows[i][j].ToString().Length < 6) || (dt.Rows[i][j].ToString().Contains("非流动资产")) && dt.Rows[i][j].ToString().Length < 7 || dt.Rows[i][j].ToString().Contains("合计") || dt.Rows[i][j].ToString().Contains("总计")) { FontFlag = true; cell.CellStyle = style3; } else { cell.CellStyle = style2; } } else { if (FontFlag) { cell.CellStyle = style4; } else { cell.CellStyle = style1; } } double Money = -1; if (double.TryParse(dt.Rows[i][j].ToString(), out Money)) { cell.SetCellValue(double.Parse(dt.Rows[i][j].ToString())); } else { cell.SetCellValue(dt.Rows[i][j].ToString()); } } } //转为字节数组 MemoryStream stream = new MemoryStream(); workbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 //if (System.IO.Directory.Exists(file) == false) //{ // System.IO.Directory.CreateDirectory(file); //} using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } else { IWorkbook workbook; string fileExt = Path.GetExtension(file).ToLower(); if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } if (workbook == null) { return; } ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); //表头 IRow row = sheet.CreateRow(0); row.Height = 25 * 20; //行高为30 // sheet.SetColumnWidth(0, 13 * 256); CellRangeAddress region = new CellRangeAddress(0, 0, 0, dt.Columns.Count - 1); sheet.SetColumnWidth(0, 30 * 256); sheet.AddMergedRegion(region); #region 标题样式 ICellStyle style = workbook.CreateCellStyle();//创建样式对象 IFont font = workbook.CreateFont(); //创建一个字体样式对象 font.FontName = "微软雅黑"; //和excel里面的字体对应 // font.Color = new HSSFColor.Pink().GetIndex();//颜色参考NPOI的颜色对照表(替换掉PINK()) font.IsItalic = false; //斜体 font.FontHeightInPoints = 14;//字体大小 font.Boldweight = short.MaxValue;//字体加粗 style.SetFont(font); //将字体样式赋给样式对象 style.BorderTop = BorderStyle.Thin; style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.WrapText = true;//设置自动换行 style.Alignment = HorizontalAlignment.Center; #endregion #region 内容样式 1 右对齐 千位符保留两位小数 ICellStyle style1 = workbook.CreateCellStyle(); IFont font1 = workbook.CreateFont(); var format1 = workbook.CreateDataFormat(); font1.FontName = "微软雅黑"; font1.IsItalic = false; font1.FontHeightInPoints = 12; font1.Boldweight = short.MaxValue; style1.SetFont(font1); //style1.DataFormat = format1.GetFormat("#,##0.00"); style1.BorderTop = BorderStyle.Thin; style1.BorderBottom = BorderStyle.Thin; style1.BorderLeft = BorderStyle.Thin; style1.BorderRight = BorderStyle.Thin; style1.WrapText = true;//设置自动换行 style1.Alignment = HorizontalAlignment.Right; #endregion #region 内容样式2 左对齐 ICellStyle style2 = workbook.CreateCellStyle(); IFont font2 = workbook.CreateFont(); font2.FontName = "微软雅黑"; font2.IsItalic = false; font2.FontHeightInPoints = 12; font2.Boldweight = short.MaxValue; style2.SetFont(font2); style2.BorderTop = BorderStyle.Thin; style2.BorderBottom = BorderStyle.Thin; style2.BorderLeft = BorderStyle.Thin; style2.BorderRight = BorderStyle.Thin; style2.WrapText = true; style2.Alignment = HorizontalAlignment.Left; #endregion #region 内容样式3 左对齐 加粗 ICellStyle style3 = workbook.CreateCellStyle(); IFont font3 = workbook.CreateFont(); font3.FontName = "微软雅黑"; font3.IsItalic = false; font3.FontHeightInPoints = 12; font3.Boldweight = (short)FontBoldWeight.Bold; style3.SetFont(font3); style3.BorderTop = BorderStyle.Thin; style3.BorderBottom = BorderStyle.Thin; style3.BorderLeft = BorderStyle.Thin; style3.BorderRight = BorderStyle.Thin; style3.WrapText = true; style3.Alignment = HorizontalAlignment.Left; #endregion #region 内容样式4 右对齐 加粗 千位符 保留两位小数 ICellStyle style4 = workbook.CreateCellStyle(); IFont font4 = workbook.CreateFont(); var format4 = workbook.CreateDataFormat(); font4.FontName = "微软雅黑"; font4.IsItalic = false; font4.FontHeightInPoints = 12; font4.Boldweight = (short)FontBoldWeight.Bold; style4.SetFont(font4); // style4.DataFormat = format4.GetFormat("#,##0.00"); style4.BorderTop = BorderStyle.Thin; style4.BorderBottom = BorderStyle.Thin; style4.BorderLeft = BorderStyle.Thin; style4.BorderRight = BorderStyle.Thin; style4.WrapText = true; style4.Alignment = HorizontalAlignment.Right; #endregion #region 内容样式 5 右对齐 ICellStyle style5 = workbook.CreateCellStyle(); IFont font5 = workbook.CreateFont(); font5.FontName = "微软雅黑"; font5.IsItalic = false; font5.FontHeightInPoints = 12; font5.Boldweight = short.MaxValue; style5.SetFont(font5); style5.BorderTop = BorderStyle.Thin; style5.BorderBottom = BorderStyle.Thin; style5.BorderLeft = BorderStyle.Thin; style5.BorderRight = BorderStyle.Thin; style5.WrapText = true;//设置自动换行 style5.Alignment = HorizontalAlignment.Right; #endregion ICell cellt = row.CreateCell(0); cellt.CellStyle = style; //把样式赋给单元格 cellt.SetCellValue(title); //数据 for (int i = 0; i < dt.Rows.Count; i++) { IRow row1 = sheet.CreateRow(i + 1); if (row1 == null) { continue; } int OldHg = row1.Height; for (int z = 0; z < dt.Columns.Count; z++) { if (row1.GetCell(z) == null) { continue; } ICell CurCell = row1.GetCell(z); if (CurCell.CellType == NPOI.SS.UserModel.CellType.String && CurCell.StringCellValue != string.Empty) { double CurHeight = row1.Sheet.GetColumnWidth(CurCell.ColumnIndex) / 277; double length = Encoding.Default.GetBytes(CurCell.ToString()).Length; short height = Convert.ToInt16(Math.Ceiling(length / CurHeight)); if (height * 256 > OldHg) { OldHg = height * 256; } } } if (row1.Height < OldHg) { row1.Height = Convert.ToInt16(OldHg); } sheet.SetColumnWidth(i + 1, 25 * 256); bool FontFlag = false; //row1.Height = 36 * 20; for (int j = 0; j < dt.Columns.Count; j++) { dt.Rows[i][j] = dt.Rows[i][j].ToString().Replace("wqeewqsdad", "").Replace("--------", "*").Replace("木部", "本部").Replace("贷币", "货币"); if (i == 0) { if (dt.Rows[i][j].ToString() == "" || dt.Rows[i][j].ToString().Length > 5) { if (j == 0) { dt.Rows[i][j] = "项目"; } } } if (dt.Columns.Count == 4 && i == 0) { if (dt.Rows[i][j].ToString() == "") { if (j == 0) { dt.Rows[i][j] = "项目"; } if (j == 2) { dt.Rows[i][j] = "本年金额"; } if (j == 3) { dt.Rows[i][j] = "上年金额"; } } } ICell cell = row1.CreateCell(j); if (j == 0) { if ((dt.Rows[i][j].ToString().Contains("流动资产") && dt.Rows[i][j].ToString().Length < 6) || (dt.Rows[i][j].ToString().Contains("非流动资产")) && dt.Rows[i][j].ToString().Length < 7 || dt.Rows[i][j].ToString().Contains("合计") || dt.Rows[i][j].ToString().Contains("总计")) { FontFlag = true; cell.CellStyle = style3; } else { cell.CellStyle = style2; } } else { if (FontFlag) { cell.CellStyle = style4; } else { cell.CellStyle = style1; } } double Money = -1; if (double.TryParse(dt.Rows[i][j].ToString(), out Money)) { cell.SetCellValue(Convert.ToDouble(dt.Rows[i][j].ToString()).ToString("0.00")); } else { cell.SetCellValue(dt.Rows[i][j].ToString()); } } } //转为字节数组 MemoryStream stream = new MemoryStream(); workbook.Write(stream); var buf = stream.ToArray(); //保存为Excel文件 //if (System.IO.Directory.Exists(file) == false) //{ // System.IO.Directory.CreateDirectory(file); //} using (FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write)) { fs.Write(buf, 0, buf.Length); fs.Flush(); } } } /// /// DataTable导出到Excel文件 /// /// 源DataTable /// 表头文本 /// 保存位置 /// 工作表名称 /// 柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41 public static void Export(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { if (strSheetName == "") { strSheetName = "Sheet"; } using (MemoryStream ms = Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames)) { using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) { byte[] data = ms.ToArray(); fs.Write(data, 0, data.Length); fs.Flush(); } } } /// /// DataTable导出到Excel的MemoryStream /// /// 源DataTable /// 表头文本 /// 工作表名称 public static MemoryStream Export(DataTable dtSource, string strHeaderText, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { if (oldColumnNames.Length != newColumnNames.Length) { return new MemoryStream(); } HSSFWorkbook workbook = new HSSFWorkbook(); FillWorkbook(ref workbook, dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames); using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet return ms; } } /// /// DataSet导出到Excel的MemoryStream /// /// 源DataSet public static MemoryStream ExportDataSet(DataSet dtSource) { HSSFWorkbook workbook = new HSSFWorkbook(); var index = 0; foreach (DataTable dt in dtSource.Tables) { index++; //生成列 string columns = ""; for (int i = 0; i < dt.Columns.Count; i++) { if (i > 0) { columns += ","; } columns += dt.Columns[i].ColumnName; } var sheetname = string.IsNullOrWhiteSpace(dt.TableName) ? ("Sheet" + index) : dt.TableName; FillWorkbook(ref workbook, dt, dt.TableName, sheetname, columns.Split(','), columns.Split(',')); } using (MemoryStream ms = new MemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position = 0; workbook = null; //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet return ms; } } private static void FillWorkbook(ref HSSFWorkbook workbook, DataTable dtSource, string strHeaderText, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { if (oldColumnNames.Length != newColumnNames.Length) { return; } ISheet sheet = workbook.CreateSheet(strSheetName); #region 右击文件 属性信息 //{ // DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); // workbook.DocumentSummaryInformation = dsi; // SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); // //if (HttpContext.Current.Session["realname"] != null) // //{ // // si.Author = HttpContext.Current.Session["realname"].ToString(); // //} // //else // //{ // // if (HttpContext.Current.Session["username"] != null) // // { // // si.Author = HttpContext.Current.Session["username"].ToString(); // // } // //} //填加xls文件作者信息 // //si.ApplicationName = "东方融资网"; //填加xls文件创建程序信息 // //si.LastAuthor = "融管系统"; //填加xls文件最后保存者信息 // //si.Comments = "融管系统自建文件"; //填加xls文件作者信息 // si.Title = strHeaderText; //填加xls文件标题信息 // si.Subject = strHeaderText; //填加文件主题信息 // si.CreateDateTime = DateTime.Now; // workbook.SummaryInformation = si; //} #endregion ICellStyle dateStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); #region 取得列宽 int[] arrColWidth = new int[oldColumnNames.Length]; for (int i = 0; i < oldColumnNames.Length; i++) { arrColWidth[i] = Encoding.GetEncoding(936).GetBytes(newColumnNames[i]).Length; } /* 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 < oldColumnNames.Length; j++) { int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][oldColumnNames[j]].ToString()) .Length; if (intTemp > arrColWidth[j]) { arrColWidth[j] = intTemp; } } /* 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; } } * */ } #endregion int rowIndex = 0; foreach (DataRow row in dtSource.Rows) { #region 新建表,填充表头,填充列头,样式 if (rowIndex == 65535 || rowIndex == 0) { if (rowIndex != 0) { sheet = workbook.CreateSheet(strSheetName + ((int)rowIndex / 65535).ToString()); } #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 Region(0, 0, 0, dtSource.Columns.Count - 1)); sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1)); } #endregion #region 列头及样式 { //HSSFRow headerRow = sheet.CreateRow(1); IRow headerRow = sheet.CreateRow(1); ICellStyle headStyle = workbook.CreateCellStyle(); headStyle.Alignment = HorizontalAlignment.Center; IFont font = workbook.CreateFont(); font.FontHeightInPoints = 10; font.Boldweight = 700; headStyle.SetFont(font); for (int i = 0; i < oldColumnNames.Length; i++) { headerRow.CreateCell(i).SetCellValue(newColumnNames[i]); headerRow.GetCell(i).CellStyle = headStyle; //设置列宽 sheet.SetColumnWidth(i, (arrColWidth[i] + 1) * 256); } /* 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); } * */ } #endregion rowIndex = 2; } #endregion #region 填充内容 IRow dataRow = sheet.CreateRow(rowIndex); //foreach (DataColumn column in dtSource.Columns) for (int i = 0; i < oldColumnNames.Length; i++) { ICell newCell = dataRow.CreateCell(i); string drValue = row[oldColumnNames[i]].ToString(); switch (dtSource.Columns[oldColumnNames[i]].DataType.ToString()) { case "System.String": //字符串类型 newCell.SetCellValue(drValue); break; case "System.DateTime": //日期类型 DateTime dateV; DateTime.TryParse(drValue, out dateV); 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++; } } /// /// WEB导出DataTable到Excel /// /// 源DataTable /// 表头文本 /// 文件名 /// 柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41 public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName) { ExportByWeb(dtSource, strHeaderText, strFileName, "sheet"); } /// /// WEB导出DataTable到Excel /// /// 源DataTable /// 表头文本 /// 输出文件名,包含扩展名 /// 要导出的DataTable列数组 /// 导出后的对应列名 public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string[] oldColumnNames, string[] newColumnNames) { ExportByWeb(dtSource, strHeaderText, strFileName, "sheet", oldColumnNames, newColumnNames); } /// /// WEB导出DataTable到Excel /// /// 源DataTable /// 表头文本 /// 输出文件名 /// 工作表名称 public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName) { HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/octet-stream"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8)); //生成列 string columns = ""; for (int i = 0; i < dtSource.Columns.Count; i++) { if (i > 0) { columns += ","; } columns += dtSource.Columns[i].ColumnName; } curContext.Response.BinaryWrite( Export(dtSource, strHeaderText, strSheetName, columns.Split(','), columns.Split(',')).GetBuffer()); curContext.Response.End(); } public static void ExportByWeb(DataSet dtSource, string strFileName) { HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/octet-stream"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8)); curContext.Response.BinaryWrite( ExportDataSet(dtSource).GetBuffer()); curContext.Response.End(); } /// /// 导出DataTable到Excel /// /// 要导出的DataTable /// 标题文字 /// 文件名,包含扩展名 /// 工作表名 /// 要导出的DataTable列数组 /// 导出后的对应列名 public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName, string strSheetName, string[] oldColumnNames, string[] newColumnNames) { HttpContext curContext = HttpContext.Current; // 设置编码和附件格式 curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Response.ContentEncoding = Encoding.UTF8; curContext.Response.Charset = ""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8)); curContext.Response.BinaryWrite( Export(dtSource, strHeaderText, strSheetName, oldColumnNames, newColumnNames).GetBuffer()); curContext.Response.End(); } /// 读取excel /// 默认第一行为表头,导入第一个工作表 /// /// excel文档路径 /// public static DataTable Import(string strFileName) { //int m = 0; try { DataTable dt = new DataTable(); HSSFWorkbook hssfworkbook; using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { hssfworkbook = new HSSFWorkbook(file); } ISheet sheet = hssfworkbook.GetSheetAt(0); System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = 0; j < cellCount; j++) { //m = j; ICell cell = headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { //if (i == 3) //{ // string mm = ""; //} IRow row = sheet.GetRow(i); if (row != null) { DataRow dataRow = dt.NewRow(); 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; } catch (Exception e) { //Console.WriteLine(m.ToString()); return null; } } /// /// 从Excel中获取数据到DataTable /// /// Excel文件全路径(服务器路径) /// 要获取数据的工作表名称 /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcel(string strFileName, string SheetName, int HeaderRowIndex) { using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(file); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } } /// /// 从Excel中获取数据到DataTable /// /// Excel文件全路径(服务器路径) /// 要获取数据的工作表序号(从0开始) /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcel(string strFileName, int SheetIndex, int HeaderRowIndex) { using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(file); string SheetName = workbook.GetSheetName(SheetIndex); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } } /// /// 从Excel中获取数据到DataTable /// /// Excel文件流 /// 要获取数据的工作表名称 /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ExcelFileStream.Close(); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } /// /// 从Excel中获取数据到DataTable /// /// Excel文件流 /// 要获取数据的工作表序号(从0开始) /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ExcelFileStream.Close(); string SheetName = workbook.GetSheetName(SheetIndex); return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } /// /// 从Excel中获取数据到DataTable(针对公司) /// /// Excel文件流 /// 要获取数据的工作表序号(从0开始) /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcelCompany(Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex = 0) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ExcelFileStream.Close(); string SheetName = workbook.GetSheetName(SheetIndex); return RenderDataTableFromExcelReport(workbook, SheetName, HeaderRowIndex, true); } /// /// 从Excel中获取数据到DataTable /// /// 要处理的工作薄 /// 要获取数据的工作表名称 /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcel(IWorkbook workbook, string SheetName, int HeaderRowIndex) { ISheet sheet = workbook.GetSheet(SheetName); DataTable table = new DataTable(); try { IRow headerRow = sheet.GetRow(HeaderRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { //headerRow.GetCell(i).SetCellType(CellType.String); DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } //int rowCount = sheet.LastRowNum; #region 循环各行各列,写入数据到DataTable for (int i = (sheet.FirstRowNum + 2); i < sheet.LastRowNum + 1; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { ICell cell = row.GetCell(j); if (cell == null) { dataRow[j] = null; } else { //dataRow[j] = cell.ToString(); switch (cell.CellType) { case CellType.Blank: dataRow[j] = null; break; case CellType.Boolean: dataRow[j] = cell.BooleanCellValue; break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { dataRow[j] = cell.DateCellValue.ToString(); } else { dataRow[j] = cell.ToString(); } break; case CellType.String: dataRow[j] = cell.StringCellValue; break; case CellType.Error: dataRow[j] = cell.ErrorCellValue; break; case CellType.Formula: cell.SetCellType(CellType.String); dataRow[j] = cell.StringCellValue; break; default: dataRow[j] = "=" + cell.CellFormula; break; } } } table.Rows.Add(dataRow); //dataRow[j] = row.GetCell(j).ToString(); } #endregion } catch (System.Exception ex) { table.Clear(); table.Columns.Clear(); table.Columns.Add("出错了"); DataRow dr = table.NewRow(); dr[0] = ex.Message; table.Rows.Add(dr); return table; } finally { //sheet.Dispose(); workbook = null; sheet = null; } #region 清除最后的空行 for (int i = table.Rows.Count - 1; i > 0; i--) { bool isnull = true; for (int j = 0; j < table.Columns.Count; j++) { if (table.Rows[i][j] != null) { if (table.Rows[i][j].ToString() != "") { isnull = false; break; } } } if (isnull) { table.Rows[i].Delete(); } else { break; } } #endregion return table; } #region 报告 /// /// 从Excel中获取数据到DataTable /// /// 要处理的工作薄 /// 要获取数据的工作表名称 /// 工作表标题行所在行号(从0开始) /// public static DataTable RenderDataTableFromExcelReport(IWorkbook workbook, string SheetName, int HeaderRowIndex, bool CompanyFlag = false) { ISheet sheet = workbook.GetSheet(SheetName); DataTable table = new DataTable(); int Cou = 0; try { IRow headerRow = sheet.GetRow(HeaderRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { //headerRow.GetCell(i).SetCellType(CellType.String); DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } //int rowCount = sheet.LastRowNum; #region 循环各行各列,写入数据到DataTable if (CompanyFlag) { try { for (int i = (sheet.FirstRowNum); i < sheet.LastRowNum + 1; i++) { IRow row = sheet.GetRow(i); if (row != null) { DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { ICell cell = row.GetCell(j); if (cell == null) { dataRow[j] = null; } else { //dataRow[j] = cell.ToString(); switch (cell.CellType) { case CellType.Blank: dataRow[j] = null; break; case CellType.Boolean: dataRow[j] = cell.BooleanCellValue; break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { if (SheetName == "资产负债表" || SheetName == "利润表" || SheetName == "现金流量表") { dataRow[j] = ""; } else { dataRow[j] = cell.DateCellValue.ToString(); } } else { dataRow[j] = cell.ToString(); } break; case CellType.String: dataRow[j] = cell.StringCellValue; break; case CellType.Error: dataRow[j] = cell.ErrorCellValue; break; case CellType.Formula: cell.SetCellType(CellType.String); dataRow[j] = cell.StringCellValue; break; default: dataRow[j] = "=" + cell.CellFormula; break; } } } table.Rows.Add(dataRow); } //dataRow[j] = row.GetCell(j).ToString(); } } catch (Exception) { var s = Cou; throw; } } else { for (int i = (sheet.FirstRowNum + 2); i < sheet.LastRowNum + 1; i++) { IRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { ICell cell = row.GetCell(j); if (cell == null) { dataRow[j] = null; } else { //dataRow[j] = cell.ToString(); switch (cell.CellType) { case CellType.Blank: dataRow[j] = null; break; case CellType.Boolean: dataRow[j] = cell.BooleanCellValue; break; case CellType.Numeric: if (DateUtil.IsCellDateFormatted(cell)) { if (SheetName == "资产负债表" || SheetName == "利润表" || SheetName == "现金流量表") { dataRow[j] = ""; } else { dataRow[j] = cell.DateCellValue.ToString(); } } else { dataRow[j] = cell.ToString(); } break; case CellType.String: dataRow[j] = cell.StringCellValue; break; case CellType.Error: dataRow[j] = cell.ErrorCellValue; break; case CellType.Formula: cell.SetCellType(CellType.String); dataRow[j] = cell.StringCellValue; break; default: dataRow[j] = "=" + cell.CellFormula; break; } } } table.Rows.Add(dataRow); //dataRow[j] = row.GetCell(j).ToString(); } } #endregion } catch (System.Exception ex) { var s = table.Rows.Count; table.Clear(); table.Columns.Clear(); table.Columns.Add("出错了"); DataRow dr = table.NewRow(); dr[0] = ex.Message; table.Rows.Add(dr); return table; } finally { //sheet.Dispose(); workbook = null; sheet = null; } #region 清除最后的空行 for (int i = table.Rows.Count - 1; i > 0; i--) { bool isnull = true; for (int j = 0; j < table.Columns.Count; j++) { if (table.Rows[i][j] != null) { if (table.Rows[i][j].ToString() != "") { isnull = false; break; } } } if (isnull) { table.Rows[i].Delete(); } else { break; } } #endregion return table; } public static DataSet RenderDataTableFromExcelReport(Stream ExcelFileStream, string[] SheetName, int HeaderRowIndex, ref bool NameExistFlag) { DataSet dataSet = new DataSet(); IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ExcelFileStream.Close(); int SheetCount = workbook.NumberOfSheets; //获取表的数量 string[] SheetNames = new string[SheetCount]; //保存表的名称 for (int i = 0; i < SheetCount; i++) { SheetNames[i] = workbook.GetSheetName(i); } foreach (var item in SheetName) { if (SheetNames.Contains(item)) { NameExistFlag = true; DataTable dt = RenderDataTableFromExcelReport(workbook, item, HeaderRowIndex); dt.TableName = item; dataSet.Tables.Add(dt.Copy()); } } return dataSet; //if (SheetNames.Contains(SheetName)) //{ // NameExistFlag = true; // return RenderDataTableFromExcelReport(workbook, SheetName, HeaderRowIndex); //} //else //{ // NameExistFlag = false; // return null; //} } #endregion public static DataTable RenderDataTableFromExcel(Stream ExcelFileStream, string SheetName, int HeaderRowIndex, ref bool NameExistFlag) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ExcelFileStream.Close(); int SheetCount = workbook.NumberOfSheets; //获取表的数量 string[] SheetNames = new string[SheetCount]; //保存表的名称 for (int i = 0; i < SheetCount; i++) { SheetNames[i] = workbook.GetSheetName(i); } if (SheetNames.Contains(SheetName)) { NameExistFlag = true; return RenderDataTableFromExcel(workbook, SheetName, HeaderRowIndex); } else { NameExistFlag = false; return null; } } public static void GenerateFiletoExcel(string TempletFilePath, string ReportFilePath, string SheetName, DataTable dt, int MaxColumn, int MaxDateCol = 1, int MaxNoteCol = 0, int MaxTypeCol = 0) { using (FileStream ExcelFileStream = new FileStream(TempletFilePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ISheet sheet1 = workbook.GetSheet(SheetName); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < MaxColumn; j++) { if (j < MaxDateCol)//前面0-MaxDateCol列日期格式 { //ICellStyle cellStyle = workbook.CreateCellStyle(); //cellStyle.IsLocked = false; //sheet1.GetRow(i + 2).GetCell(j).CellStyle = cellStyle; //string test = dt.Rows[i][j].ToString().Replace("/","-"); if ((SheetName == "回收计划" || SheetName == "支付计划") && MaxTypeCol == 1) { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(dt.Rows[i][j].ToString().Replace("0:00:00", "").Replace("-", "/")); } else { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(dt.Rows[i][j].ToString().Replace("0:00:00", "").Replace("/", "-")); } } else if (MaxNoteCol > 0 && j >= MaxColumn - 1) //后面最后一列是备注内容 { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else if (MaxTypeCol > 0 && j >= MaxColumn - 2)//列中有布尔类型 { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(Convert.ToBoolean(dt.Rows[i][j].ToString()) == true ? "是" : "否"); } else if (SheetName == "流动性分析") { if (j == 0) { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(Convert.ToInt32(dt.Rows[i][j].ToString())); } else if (j == 3 || j == 5) { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(double.Parse(dt.Rows[i][j].ToString())); } } else if (SheetName == "收款分析" || SheetName == "付款分析") { if (j == 0) { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(Convert.ToInt32(dt.Rows[i][j].ToString())); } else if (j == 1) { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(dt.Rows[i][j].ToString().Replace("0:00:00", "").Replace("-", "/")); } else if (j == 2) { IRow row = sheet1.GetRow(i + 2); ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(double.Parse(dt.Rows[i][j].ToString())); } } } } sheet1.ProtectSheet(SheetLockPassword); ISheet sheetNote = workbook.GetSheet("填写说明"); if (sheetNote != null) { sheetNote.ProtectSheet(SheetLockPassword); } using (FileStream filess = File.OpenWrite(ReportFilePath)) { workbook.Write(filess); } } } #region 导出报表 public static void GenerateReportExcel(string[] SheetArr, string TempletFilePath, string ReportFilePath, DataSet dt, int MaxColumn) { //IWorkbook workbook; //string fileExt = Path.GetExtension(ReportFilePath).ToLower(); //if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } //if (workbook == null) { return; } using (FileStream ExcelFileStream = new FileStream(TempletFilePath, FileMode.Open, FileAccess.Read)) { string[] SheetAll = new[] { "填写说明", "一般企业-资产负债表", "一般企业-利润表", "一般企业-现金流量表", "一般企业-现金流量表补充资料", "一般企业-所有者权益变动表", "商业银行-资产负债表", "商业银行-利润表", "商业银行-现金流量表", "商业银行-现金流量表补充资料", "商业银行-所有者权益变动表", "证券公司-资产负债表", "证券公司-利润表", "证券公司-现金流量表", "证券公司-现金流量表补充资料", "证券公司-所有者权益变动表", "保险公司-资产负债表", "保险公司-利润表", "保险公司-现金流量表", "保险公司-现金流量表补充资料", "保险公司-所有者权益变动表", "综合企业-资产负债表", "综合企业-利润表", "综合企业-现金流量表", "综合企业-现金流量表补充资料", "综合企业-所有者权益变动表" }; #region 预设行数 //var SheetRow = 0; //if (SheetName == "资产负债表") //{ // if (ReportType == "合并报表") // { // SheetName = "资产负债表-合并"; // SheetRow = 136; // } // else // { // SheetName = "资产负债表-母公司"; // SheetRow = 134; // } //} //else if (SheetName == "利润表") //{ // if (ReportType == "合并报表") // { // SheetName = "利润表-合并"; // SheetRow = 87; // } // else // { // SheetName = "利润表-母公司"; // SheetRow = 80; // } //} //else if(SheetName== "现金流量表") //{ // if (ReportType == "合并报表") // { // SheetName = "现金流量表-合并"; // SheetRow = 66; // } // else // { // SheetName = "现金流量表-母公司"; // SheetRow = 64; // } //} //else if (SheetName=="现金流量表补充资料") //{ // if (ReportType== "合并报表") // { // SheetName = "现金流量表补充资料-合并"; // } // else // { // SheetName = "现金流量表补充资料-母公司"; // } // SheetRow = 32; //} //else if (SheetName== "所有者权益变动表") //{ // if (ReportType == "合并报表") // { // SheetName = "所有者权益变动表-合并"; // } // else // { // SheetName = "所有者权益变动表-母公司"; // } // SheetRow = 28; //} #endregion IWorkbook workbook1 = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); var DelSheet = SheetAll.Except(SheetArr).ToList(); List Index = new List(); //foreach (var item in SheetArr) //{ // Index.Add(workbook1.GetSheetIndex(item)); //} //var SheetNum = workbook1.NumberOfSheets; //for (int i = 0; i < SheetNum; i++) //{ // if (!Index.Equals(i)) // { // workbook1.RemoveSheetAt(i); // } //} for (int i = 0; i < DelSheet.Count; i++) { workbook1.RemoveSheetAt(workbook1.GetSheetIndex(DelSheet[i])); } //ISheet sheet2 = workbook1.GetSheet(SheetArr[1]); //ISheet sheet3 = workbook1.GetSheet(SheetArr[2]); //ISheet sheet4 = workbook1.GetSheet(SheetArr[3]); //ISheet sheet5 = workbook1.GetSheet(SheetArr[4]); // ISheet sheet = workbook.CreateSheet(dt.Tables[z].TableName); //CopySheet(workbook, sheet1, sheet, true); // XSSFWorkbook myBook = new XSSFWorkbook(fs2); // workbook.CreateSheet(dt.Tables[z].TableName); //ISheet sheet=string.IsNullOrEmpty(dt.Tables[z].TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.Tables[z].TableName); //string.IsNullOrEmpty(dt.Tables[z].TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.Tables[z].TableName); //sheet1.ForceFormulaRecalculation = false; //for (int i = 0; i < dt.Tables[z].Rows.Count; i++) //{ //ISheet sheet2 = workbook1.GetSheet(SheetArr[1]); //ISheet sheet3 = workbook1.GetSheet(SheetArr[2]); //ISheet sheet4 = workbook1.GetSheet(SheetArr[3]); //ISheet sheet5 = workbook1.GetSheet(SheetArr[4]); #region 按模板导出 for (int z = 0; z < dt.Tables.Count; z++) { ISheet sheet1 = workbook1.GetSheet(SheetArr[z]); int i = 0; if (dt.Tables[z].TableName == "资产负债表") { i += 4; } else if (dt.Tables[z].TableName == "利润表") { i += 4; } else if (dt.Tables[z].TableName == "现金流量表") { i += 4; } else if (dt.Tables[z].TableName == "现金流量表补充资料") { i += 4; } else if (dt.Tables[z].TableName == "所有者权益变动表") { i += 6; } if (!SheetArr[z].Contains("综合企业")) { for (int j = 0; j < dt.Tables[z].Rows.Count; j++) { IRow row = sheet1.GetRow(j + i); if (dt.Tables[z].TableName == "所有者权益变动表") { var SName = row.GetCell(0); if (SName != null && SName.ToString().Trim() != "") { var Sel = dt.Tables[z].Select("Name like '%" + SName.ToString().Trim().Replace("%", "[%]").Replace("*", "[*]") + "%'").ToList(); if (Sel != null && Sel.Count == 1) { int index = 1; foreach (var item in Sel[0].Table.Rows) { ICell cell = row.GetCell(index); if (index == 15) { cell.SetCellValue(Sel[0][index].ToString() == null ? "--" : Sel[0][index].ToString()); } else if (index < 15) { cell.SetCellValue(double.Parse(Sel[0][index].ToString())); } index++; } } else if (Sel.Count > 1) { var OneArr = dt.Tables[z].Select("Name like '" + SName.ToString().Trim() + "'").ToList(); if (OneArr.Count > 0) { int index = 1; foreach (var item in Sel[0].Table.Rows) { ICell cell = row.GetCell(index); if (index == 15) { cell.SetCellValue(Sel[0][index].ToString() == null ? "--" : Sel[0][index].ToString()); } else if (index < 15) { cell.SetCellValue(double.Parse(Sel[0][index].ToString())); } index++; } } } } } else { if (row != null) { var SName = row.GetCell(1); if (SName != null && SName.ToString().Trim() != "") { if (SName.ToString().Trim() != "流动资产合计" && SName.ToString().Trim() != "非流动资产合计" && SName.ToString().Trim() != "资产总计" && SName.ToString().Trim() != "流动负债合计" && SName.ToString().Trim() != "非流动负债合计" && SName.ToString().Trim() != "负债总计" && SName.ToString().Trim() != "归属于母公司所有者权益 (或股东权益)合计" && SName.ToString().Trim() != "所有者权益(或股东权益)合计" && SName.ToString().Trim() != "负债和所有者权益总计") { var Sel = dt.Tables[z].Select("Name like '%" + SName.ToString().Trim().Replace("%", "[%]").Replace("*", "[*]") + "%'").ToList(); if (Sel != null && Sel.Count == 1) { ICell cell = row.GetCell(2); cell.SetCellValue(double.Parse(Sel[0][2].ToString())); if (!dt.Tables[z].TableName.Equals("现金流量表") && !dt.Tables[z].TableName.Equals("现金流量表补充资料")) { if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") { ICell cell2 = row.GetCell(3); cell2.SetCellValue(Sel[0][3].ToString() == null ? double.Parse("0") : double.Parse(Sel[0][3].ToString())); } ICell cell3 = row.GetCell(4); if (z == 1) { cell3.SetCellValue(Sel[0][5].ToString() == null ? "--" : Sel[0][5].ToString()); } else { cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); } } else { ICell cell2 = row.GetCell(3); cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); } } else if (Sel.Count > 1) { var OneArr = dt.Tables[z].Select("Name like '" + SName.ToString().Trim() + "'").ToList(); ICell cell = row.GetCell(2); if (OneArr.Count > 0) { cell.SetCellValue(double.Parse(OneArr[0][2].ToString())); } if (!dt.Tables[z].TableName.Contains("现金流量表")) { if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") { ICell cell2 = row.GetCell(3); if (OneArr.Count > 0) { cell2.SetCellValue(OneArr[0][3].ToString() == null ? double.Parse("0") : double.Parse(OneArr[0][3].ToString())); } } ICell cell3 = row.GetCell(4); if (OneArr.Count > 0) { if (z == 1) { cell3.SetCellValue(Sel[0][5].ToString() == null ? "--" : Sel[0][5].ToString()); } else { cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); } } } else { ICell cell2 = row.GetCell(3); if (OneArr.Count > 0) { cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); } cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); } } } } } } } } else { for (int j = 0; j < dt.Tables[z].Rows.Count; j++) { IRow row = sheet1.GetRow(j + i); if (dt.Tables[z].TableName == "所有者权益变动表") { var SName = row.GetCell(0); if (SName != null && SName.ToString().Trim() != "") { var Sel = dt.Tables[z].Select("Name like '%" + SName.ToString().Trim().Replace("%", "[%]").Replace("*", "[*]") + "%'").ToList(); if (Sel != null && Sel.Count == 1) { int index = 1; foreach (var item in Sel[0].Table.Rows) { ICell cell = row.GetCell(index); if (index == 15) { cell.SetCellValue(Sel[0][index].ToString() == null ? "--" : Sel[0][index].ToString()); } else if (index < 15) { cell.SetCellValue(double.Parse(Sel[0][index].ToString())); } index++; } } else if (Sel.Count > 1) { var OneArr = dt.Tables[z].Select("Name like '" + SName.ToString().Trim() + "'").ToList(); if (OneArr.Count > 0) { int index = 1; foreach (var item in Sel[0].Table.Rows) { ICell cell = row.GetCell(index); if (index == 15) { cell.SetCellValue(Sel[0][index].ToString() == null ? "--" : Sel[0][index].ToString()); } else if (index < 15) { cell.SetCellValue(double.Parse(Sel[0][index].ToString())); } index++; } } } } } else { if (row != null) { var SName = row.GetCell(0); if (SName != null && SName.ToString().Trim() != "") { if (SName.ToString().Trim() != "流动资产合计" && SName.ToString().Trim() != "非流动资产合计" && SName.ToString().Trim() != "资产总计" && SName.ToString().Trim() != "流动负债合计" && SName.ToString().Trim() != "非流动负债合计" && SName.ToString().Trim() != "负债总计" && SName.ToString().Trim() != "归属于母公司所有者权益合计" && SName.ToString().Trim() != "所有者权益合计" && SName.ToString().Trim() != "负债和所有者权益总计") { var Sel = dt.Tables[z].Select("Name like '" + SName.ToString().Trim().Replace("%", "[%]").Replace("*", "[*]") + "'").ToList(); if (Sel != null && Sel.Count == 1) { ICell cell = row.GetCell(1); cell.SetCellValue(double.Parse(Sel[0][2].ToString())); if (!dt.Tables[z].TableName.Equals("现金流量表") && !dt.Tables[z].TableName.Equals("现金流量表补充资料")) { if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") { ICell cell2 = row.GetCell(2); cell2.SetCellValue(Sel[0][3].ToString() == null ? double.Parse("0") : double.Parse(Sel[0][3].ToString())); } ICell cell3 = row.GetCell(3); if (z == 1) { cell3.SetCellValue(Sel[0][5].ToString() == null ? "--" : Sel[0][5].ToString()); } else { cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); } } else { ICell cell2 = row.GetCell(2); cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); } } else if (Sel.Count > 1) { int SelIndex = 0; if (SName.ToString().IndexOf(" ") >= 0) { SelIndex= Sel[0][0].ToString().Contains("2")?0:1; } ICell cell = row.GetCell(1); cell.SetCellValue(double.Parse(Sel[SelIndex][2].ToString())); if (!dt.Tables[z].TableName.Contains("现金流量表")) { if (Sel[SelIndex][0].ToString() != "所有者权益" && Sel[SelIndex][1].ToString() != "其中:优先股" && Sel[SelIndex][1].ToString() != "永续债") { ICell cell2 = row.GetCell(2); if (Sel.Count > 0) { cell2.SetCellValue(Sel[SelIndex][3].ToString() == null ? double.Parse("0") : double.Parse(Sel[SelIndex][3].ToString())); } } ICell cell3 = row.GetCell(3); if (Sel.Count > 0) { if (z == 1) { cell3.SetCellValue(Sel[SelIndex][5].ToString() == null ? "--" : Sel[SelIndex][5].ToString()); } else { cell3.SetCellValue(Sel[SelIndex][4].ToString() == null ? "--" : Sel[SelIndex][4].ToString()); } } } else { ICell cell2 = row.GetCell(2); if (Sel.Count > 0) { cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); } cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); } } #region //if (Sel != null) //{ // ICell cell = row.GetCell(2); // cell.SetCellValue(double.Parse(Sel[0][2].ToString())); // if (!dt.Tables[z].TableName.Equals("现金流量表") && !dt.Tables[z].TableName.Equals("现金流量表补充资料")) // { // if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") // { // ICell cell2 = row.GetCell(3); // cell2.SetCellValue(Sel[0][3].ToString() == null ? double.Parse("0") : double.Parse(Sel[0][3].ToString())); // } // ICell cell3 = row.GetCell(4); // if (z == 1) // { // cell3.SetCellValue(Sel[0][5].ToString() == null ? "--" : Sel[0][5].ToString()); // } // else // { // cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); // } // } // else // { // ICell cell2 = row.GetCell(3); // cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); // } //} //else if (Sel.Count > 1) //{ // var OneArr = dt.Tables[z].Select("Name like '" + SName.ToString().Trim() + "'").ToList(); // ICell cell = row.GetCell(2); // if (OneArr.Count > 0) // { // cell.SetCellValue(double.Parse(OneArr[0][2].ToString())); // } // if (!dt.Tables[z].TableName.Contains("现金流量表")) // { // if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") // { // ICell cell2 = row.GetCell(3); // if (OneArr.Count > 0) // { // cell2.SetCellValue(OneArr[0][3].ToString() == null ? double.Parse("0") : double.Parse(OneArr[0][3].ToString())); // } // } // ICell cell3 = row.GetCell(4); // if (OneArr.Count > 0) // { // if (z == 1) // { // cell3.SetCellValue(Sel[0][5].ToString() == null ? "--" : Sel[0][5].ToString()); // } // else // { // cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); // } // } // } // else // { // ICell cell2 = row.GetCell(3); // if (OneArr.Count > 0) // { // cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); // } // cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); // } //} #endregion } } } } } } } #endregion #region 直接导出 //if (SheetName.Contains("所有者权益变动表")) //{ // for (int j = 0; j < MaxColumn; j++) // { // if (ReportType == "合并报表") // { // if (j == 0 || j == 15) // { // IRow row = sheet1.GetRow(i + 11); // if (row != null) // { // ICell cell = row.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 11); // ICell cell = row1.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // else // { // IRow row = sheet1.GetRow(i + 11); // if (row != null) // { // ICell cell = row.GetCell(j); // if (cell != null) // { // row.RemoveCell(cell); // } // ICell cell1 = row.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell1.CellStyle = cellStyle; // cell1.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 11); // ICell cell = row1.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // } // else // { // if (j == 0 || j == 13) // { // IRow row = sheet1.GetRow(i + 11); // if (row != null) // { // ICell cell = row.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 11); // ICell cell = row1.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // else // { // IRow row = sheet1.GetRow(i + 11); // if (row != null) // { // ICell cell = row.GetCell(j); // if (cell != null) // { // row.RemoveCell(cell); // } // ICell cell1 = row.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell1.CellStyle = cellStyle; // cell1.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 11); // ICell cell = row1.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // } // } //} //else //{ // for (int j = 0; j < MaxColumn; j++) // { // if (MaxColumn == 5) // { // if (j == 0 || j == 1 || j == 4) // { // IRow row = sheet1.GetRow(i + 7); // if (row != null) // { // ICell cell = row.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 7); // ICell cell = row1.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // else // { // IRow row = sheet1.GetRow(i + 7); // if (row != null) // { // ICell cell = row.GetCell(j); // if (cell != null) // { // row.RemoveCell(cell); // } // ICell cell1 = row.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell1.CellStyle = cellStyle; // cell1.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 7); // ICell cell = row1.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // } // else // { // if (j == 0 || j == 1 || j == 3) // { // IRow row = sheet1.GetRow(i + 7); // if (row != null) // { // ICell cell = row.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 7); // ICell cell = row1.CreateCell(j, CellType.String); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // else // { // IRow row = sheet1.GetRow(i + 7); // if (row != null) // { // ICell cell = row.GetCell(j); // if (cell != null) // { // row.RemoveCell(cell); // } // ICell cell1 = row.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell1.CellStyle = cellStyle; // cell1.SetCellValue(dt.Rows[i][j].ToString()); // } // else // { // IRow row1 = sheet1.CreateRow(i + 7); // ICell cell = row1.CreateCell(j, CellType.Numeric); // ICellStyle cellStyle = workbook.CreateCellStyle(); // cellStyle.BorderBottom = BorderStyle.Thin; // cellStyle.BorderRight = BorderStyle.Thin; // cellStyle.IsLocked = false; // cell.CellStyle = cellStyle; // cell.SetCellValue(dt.Rows[i][j].ToString()); // } // } // } // } //} #endregion //} //var Num = SheetRow - dt.Rows.Count; //if (Num>0) //{ // for (int i = dt.Rows.Count; i <= SheetRow; i++) // { // IRow row = sheet1.GetRow(i + 7); // for (int j = 0; j < MaxColumn; j++) // { // ICell cell = row.GetCell(j); // if (cell!=null) // { // row.RemoveCell(cell); // } // } // } //} //sheet1.ProtectSheet(SheetLockPassword); //ISheet sheetNote = workbook.GetSheet("填写说明"); //if (sheetNote != null) //{ // sheetNote.ProtectSheet(SheetLockPassword); //} // work using (FileStream filess = File.OpenWrite(ReportFilePath)) { workbook1.Write(filess); } } } public static void GenerateReportExcel(string TempletFilePath, string ReportFilePath, string SheetName, DataTable dt, string ReportType, int MaxColumn) { using (FileStream ExcelFileStream = new FileStream(TempletFilePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); #region 预设行数 var SheetRow = 0; if (SheetName == "资产负债表") { if (ReportType == "合并报表") { SheetName = "资产负债表-合并"; SheetRow = 136; } else { SheetName = "资产负债表-母公司"; SheetRow = 134; } } else if (SheetName == "利润表") { if (ReportType == "合并报表") { SheetName = "利润表-合并"; SheetRow = 87; } else { SheetName = "利润表-母公司"; SheetRow = 80; } } else if (SheetName == "现金流量表") { if (ReportType == "合并报表") { SheetName = "现金流量表-合并"; SheetRow = 66; } else { SheetName = "现金流量表-母公司"; SheetRow = 64; } } else if (SheetName == "现金流量表补充资料") { if (ReportType == "合并报表") { SheetName = "现金流量表补充资料-合并"; } else { SheetName = "现金流量表补充资料-母公司"; } SheetRow = 32; } else if (SheetName == "所有者权益变动表") { if (ReportType == "合并报表") { SheetName = "所有者权益变动表-合并"; } else { SheetName = "所有者权益变动表-母公司"; } SheetRow = 28; } #endregion ISheet sheet1 = workbook.GetSheet(SheetName); sheet1.ForceFormulaRecalculation = false; for (int i = 0; i < dt.Rows.Count; i++) { #region 按模板导出 //IRow row = sheet1.GetRow(i + 7); //var SName = row.GetCell(1); //if (SName.ToString().Trim() != null && SName.ToString().Trim() != "") //{ // if (SName.ToString().Trim() != "流动资产合计" && SName.ToString().Trim() != "非流动资产合计" && SName.ToString().Trim() != "资产总计" && SName.ToString().Trim() != "流动负债合计" && SName.ToString().Trim() != "非流动负债合计" && SName.ToString().Trim() != "负债总计" && SName.ToString().Trim() != "归属于母公司所有者权益 (或股东权益)合计" && SName.ToString().Trim() != "所有者权益(或股东权益)合计" && SName.ToString().Trim() != "负债和所有者权益(或股东权益)总计") // { // var Sel = dt.Select("Name like '%" + SName.ToString().Trim().Replace("%", "[%]").Replace("*", "[*]") + "%'").ToList(); // if (Sel != null && Sel.Count == 1) // { // ICell cell = row.GetCell(2); // cell.SetCellValue(double.Parse(Sel[0][2].ToString())); // if (!SheetName.Contains("现金流量表")) // { // if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") // { // ICell cell2 = row.GetCell(3); // cell2.SetCellValue(Sel[0][3].ToString() == null ? double.Parse("0") : double.Parse(Sel[0][3].ToString())); // } // ICell cell3 = row.GetCell(4); // cell3.SetCellValue(Sel[0][4].ToString() == null ? "--" : Sel[0][4].ToString()); // } // else // { // ICell cell2 = row.GetCell(3); // cell2.SetCellValue(Sel[0][3].ToString() == null ? "--" : Sel[0][3].ToString()); // } // } // else if (Sel.Count > 1) // { // var OneArr = dt.Select("Name like '" + SName.ToString().Trim() + "'").ToList(); // ICell cell = row.GetCell(2); // if (OneArr.Count > 0) // { // cell.SetCellValue(double.Parse(OneArr[0][2].ToString())); // } // if (!SheetName.Contains("现金流量表")) // { // if (Sel[0][0].ToString() != "所有者权益" && Sel[0][1].ToString() != "其中:优先股" && Sel[0][1].ToString() != "永续债") // { // ICell cell2 = row.GetCell(3); // if (OneArr.Count > 0) // { // cell2.SetCellValue(OneArr[0][3].ToString() == null ? double.Parse("0") : double.Parse(OneArr[0][3].ToString())); // } // } // ICell cell3 = row.GetCell(4); // if (OneArr.Count > 0) // { // cell3.SetCellValue(OneArr[0][4].ToString() == null ? "--" : OneArr[0][4].ToString()); // } // } // else // { // ICell cell2 = row.GetCell(3); // if (OneArr.Count > 0) // { // cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); // } // cell2.SetCellValue(OneArr[0][3].ToString() == null ? "--" : OneArr[0][3].ToString()); // } // } // } //} #endregion #region 直接导出 if (SheetName.Contains("所有者权益变动表")) { for (int j = 0; j < MaxColumn; j++) { if (ReportType == "合并报表") { if (j == 0 || j == 15) { IRow row = sheet1.GetRow(i + 11); if (row != null) { ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 11); ICell cell = row1.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } else { IRow row = sheet1.GetRow(i + 11); if (row != null) { ICell cell = row.GetCell(j); if (cell != null) { row.RemoveCell(cell); } ICell cell1 = row.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell1.CellStyle = cellStyle; cell1.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 11); ICell cell = row1.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } } else { if (j == 0 || j == 13) { IRow row = sheet1.GetRow(i + 11); if (row != null) { ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 11); ICell cell = row1.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } else { IRow row = sheet1.GetRow(i + 11); if (row != null) { ICell cell = row.GetCell(j); if (cell != null) { row.RemoveCell(cell); } ICell cell1 = row.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell1.CellStyle = cellStyle; cell1.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 11); ICell cell = row1.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } } } } else { for (int j = 0; j < MaxColumn; j++) { if (MaxColumn == 5) { if (j == 0 || j == 1 || j == 4) { IRow row = sheet1.GetRow(i + 7); if (row != null) { ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 7); ICell cell = row1.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } else { IRow row = sheet1.GetRow(i + 7); if (row != null) { ICell cell = row.GetCell(j); if (cell != null) { row.RemoveCell(cell); } ICell cell1 = row.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell1.CellStyle = cellStyle; cell1.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 7); ICell cell = row1.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } } else { if (j == 0 || j == 1 || j == 3) { IRow row = sheet1.GetRow(i + 7); if (row != null) { ICell cell = row.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 7); ICell cell = row1.CreateCell(j, CellType.String); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } else { IRow row = sheet1.GetRow(i + 7); if (row != null) { ICell cell = row.GetCell(j); if (cell != null) { row.RemoveCell(cell); } ICell cell1 = row.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell1.CellStyle = cellStyle; cell1.SetCellValue(dt.Rows[i][j].ToString()); } else { IRow row1 = sheet1.CreateRow(i + 7); ICell cell = row1.CreateCell(j, CellType.Numeric); ICellStyle cellStyle = workbook.CreateCellStyle(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.IsLocked = false; cell.CellStyle = cellStyle; cell.SetCellValue(dt.Rows[i][j].ToString()); } } } } } #endregion } var Num = SheetRow - dt.Rows.Count; if (Num > 0) { for (int i = dt.Rows.Count; i <= SheetRow; i++) { IRow row = sheet1.GetRow(i + 7); for (int j = 0; j < MaxColumn; j++) { ICell cell = row.GetCell(j); if (cell != null) { row.RemoveCell(cell); } } } } //sheet1.ProtectSheet(SheetLockPassword); ISheet sheetNote = workbook.GetSheet("填写说明"); if (sheetNote != null) { sheetNote.ProtectSheet(SheetLockPassword); } using (FileStream filess = File.OpenWrite(ReportFilePath)) { workbook.Write(filess); } } } #region //public static void CopyCellStyle(IWorkbook wb, ICellStyle fromStyle, ICellStyle toStyle) //{ // toStyle.Alignment = fromStyle.Alignment; // //边框和边框颜色 // toStyle.BorderBottom = fromStyle.BorderBottom; // toStyle.BorderLeft = fromStyle.BorderLeft; // toStyle.BorderRight = fromStyle.BorderRight; // toStyle.BorderTop = fromStyle.BorderTop; // toStyle.TopBorderColor = fromStyle.TopBorderColor; // toStyle.BottomBorderColor = fromStyle.BottomBorderColor; // toStyle.RightBorderColor = fromStyle.RightBorderColor; // toStyle.LeftBorderColor = fromStyle.LeftBorderColor; // //背景和前景 // toStyle.FillBackgroundColor = fromStyle.FillBackgroundColor; // toStyle.FillForegroundColor = fromStyle.FillForegroundColor; // toStyle.DataFormat = fromStyle.DataFormat; // toStyle.FillPattern = fromStyle.FillPattern; // //toStyle.Hidden=fromStyle.Hidden; // toStyle.IsHidden = fromStyle.IsHidden; // toStyle.Indention = fromStyle.Indention;//首行缩进 // toStyle.IsLocked = fromStyle.IsLocked; // toStyle.Rotation = fromStyle.Rotation;//旋转 // toStyle.VerticalAlignment = fromStyle.VerticalAlignment; // toStyle.WrapText = fromStyle.WrapText; // toStyle.SetFont(fromStyle.GetFont(wb)); //} ///// ///// 复制表 ///// ///// ///// ///// ///// //public static void CopySheet(IWorkbook wb, ISheet fromSheet, ISheet toSheet, bool copyValueFlag) //{ // //合并区域处理 // MergerRegion(fromSheet, toSheet); // System.Collections.IEnumerator rows = fromSheet.GetRowEnumerator(); // while (rows.MoveNext()) // { // IRow row = null; // if (wb is HSSFWorkbook) // row = rows.Current as HSSFRow; // else // row = rows.Current as NPOI.XSSF.UserModel.XSSFRow; // IRow newRow = toSheet.CreateRow(row.RowNum); // CopyRow(wb, row, newRow, copyValueFlag); // } //} ///// ///// 复制行 ///// ///// ///// ///// ///// //public static void CopyRow(IWorkbook wb, IRow fromRow, IRow toRow, bool copyValueFlag) //{ // System.Collections.IEnumerator cells = fromRow.GetEnumerator();//.GetRowEnumerator(); // toRow.Height = fromRow.Height; // while (cells.MoveNext()) // { // ICell cell = null; // //ICell cell = (wb is HSSFWorkbook) ? cells.Current as HSSFCell : cells.Current as NPOI.XSSF.UserModel.XSSFCell; // if (wb is HSSFWorkbook) // cell = cells.Current as HSSFCell; // else // cell = cells.Current as NPOI.XSSF.UserModel.XSSFCell; // ICell newCell = toRow.CreateCell(cell.ColumnIndex); // CopyCell(wb, cell, newCell, copyValueFlag); // } //} ///// ///// 复制原有sheet的合并单元格到新创建的sheet ///// ///// ///// //public static void MergerRegion(ISheet fromSheet, ISheet toSheet) //{ // int sheetMergerCount = fromSheet.NumMergedRegions; // for (int i = 0; i < sheetMergerCount; i++) // { // //Region mergedRegionAt = fromSheet.GetMergedRegion(i); //.MergedRegionAt(i); // //CellRangeAddress[] cra = new CellRangeAddress[1]; // //cra[0] = fromSheet.GetMergedRegion(i); // //Region[] rg = Region.ConvertCellRangesToRegions(cra); // toSheet.AddMergedRegion(fromSheet.GetMergedRegion(i)); // } //} ///// ///// 复制单元格 ///// ///// ///// ///// ///// //public static void CopyCell(IWorkbook wb, ICell srcCell, ICell distCell, bool copyValueFlag) //{ // ICellStyle newstyle = wb.CreateCellStyle(); // CopyCellStyle(wb, srcCell.CellStyle, newstyle); // //样式 // distCell.CellStyle = newstyle; // //评论 // if (srcCell.CellComment != null) // { // distCell.CellComment = srcCell.CellComment; // } // // 不同数据类型处理 // CellType srcCellType = srcCell.CellType; // distCell.SetCellType(srcCellType); // if (copyValueFlag) // { // if (srcCellType == CellType.Numeric) // { // if (HSSFDateUtil.IsCellDateFormatted(srcCell)) // { // distCell.SetCellValue(srcCell.DateCellValue); // } // else // { // distCell.SetCellValue(srcCell.NumericCellValue); // } // } // else if (srcCellType == CellType.String) // { // distCell.SetCellValue(srcCell.RichStringCellValue); // } // else if (srcCellType == CellType.Blank) // { // // nothing21 // } // else if (srcCellType == CellType.Boolean) // { // distCell.SetCellValue(srcCell.BooleanCellValue); // } // else if (srcCellType == CellType.Error) // { // distCell.SetCellErrorValue(srcCell.ErrorCellValue); // } // else if (srcCellType == CellType.Formula) // { // distCell.SetCellFormula(srcCell.CellFormula); // } // else // { // nothing29 // } // } //} #endregion public static void GenerateReportTemplate(string TempletFilePath, string ReportFilePath, string SheetName) { using (FileStream ExcelFileStream = new FileStream(TempletFilePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ISheet sheet1 = workbook.GetSheet(SheetName); //sheet1.ProtectSheet(SheetLockPassword); ISheet sheetNote = workbook.GetSheet("填写说明"); if (sheetNote != null) { sheetNote.ProtectSheet(SheetLockPassword); } using (FileStream filess = File.OpenWrite(ReportFilePath)) { workbook.Write(filess); } } } #endregion public static void GenerateFiletoExcel(string TempletFilePath, string ReportFilePath, string SheetName, string SheetNameCashFlow, DataTable dt, DataTable dtCashFlow, int MaxColumn) { using (FileStream ExcelFileStream = new FileStream(TempletFilePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(ExcelFileStream); ISheet sheet1 = workbook.GetSheet(SheetName); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < MaxColumn; j++) { sheet1.GetRow(i + 2).GetCell(j).SetCellValue(dt.Rows[i][j].ToString().Replace("0:00:00", "")); } } ISheet sheet2 = workbook.GetSheet(SheetNameCashFlow); for (int i = 0; i < dtCashFlow.Rows.Count; i++) { for (int j = 0; j < dtCashFlow.Columns.Count; j++) { if ((i < 2 || i == dtCashFlow.Rows.Count - 1) || j <= 1) { sheet2.GetRow(i + 1).GetCell(j) .SetCellValue(dtCashFlow.Rows[i][j].ToString().Replace("0:00:00", "")); } else { double Result = 0; double.TryParse(dtCashFlow.Rows[i][j].ToString(), out Result); ICellStyle cellStyle = workbook.CreateCellStyle(); IDataFormat format = workbook.CreateDataFormat(); cellStyle.BorderBottom = BorderStyle.Thin; cellStyle.BorderRight = BorderStyle.Thin; cellStyle.BorderLeft = BorderStyle.Thin; cellStyle.IsLocked = false; if (dtCashFlow.Rows[i][0].ToString().IndexOf("数量") < 0) { cellStyle.DataFormat = format.GetFormat("#,##0.00"); } else { cellStyle.DataFormat = format.GetFormat("0.00"); } sheet2.GetRow(i + 1).GetCell(j).CellStyle = cellStyle; sheet2.GetRow(i + 1).GetCell(j).SetCellValue(Result); } } } sheet1.ProtectSheet(SheetLockPassword); sheet2.ProtectSheet(SheetLockPassword); ISheet sheetNote = workbook.GetSheet("填写说明"); if (sheetNote != null) { sheetNote.ProtectSheet(SheetLockPassword); } using (FileStream filess = File.OpenWrite(ReportFilePath)) { workbook.Write(filess); } } } public static double PMTFunction(double Rate, double Year, double Cash) { double Result = 0; IWorkbook workbook = new HSSFWorkbook(); ISheet sheet1 = workbook.CreateSheet("Sheet1"); IRow row1 = sheet1.CreateRow(0); ICell cell1 = row1.CreateCell(0); ICell cell2 = row1.CreateCell(1); ICell cell3 = row1.CreateCell(2); ICell cellSum = row1.CreateCell(3); cell1.SetCellValue(Rate); cell2.SetCellValue(Year); cell3.SetCellValue(Cash); cellSum.SetCellFormula("PMT(A1,B1,C1)"); HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook); cellSum = e.EvaluateInCell(cellSum); Result = cellSum.NumericCellValue * (-1); return Result; } //public static double LOGNORMDISTFunction(double BaseAverage, double BaseSqrt) //{ // double Result = 0; // //IWorkbook workbook = new HSSFWorkbook(); // //ISheet sheet1 = workbook.CreateSheet("Sheet1"); // //IRow row1 = sheet1.CreateRow(0); // //ICell cell1 = row1.CreateCell(0); // //ICell cell2 = row1.CreateCell(1); // //ICell cell3 = row1.CreateCell(2); // //ICell cellSum = row1.CreateCell(3); // //cell1.SetCellValue(1); // //cell2.SetCellValue(BaseAverage); // //cell3.SetCellValue(BaseSqrt); // //cellSum.SetCellFormula("LOGNORMDIST(A1,B1,C1)"); // //HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook); // //cellSum = e.EvaluateInCell(cellSum); // //Result = cellSum.NumericCellValue ; // Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); // Result = excel.WorksheetFunction.LogNormDist(1.0, BaseAverage, BaseSqrt); // return Result; //} } }