本文为大家分享了基于NPOI用C#开发的Excel以及表格设置,供大家参考,具体内容如下
最近在项目中需要导出Excel。在这里做个记录。在网上查阅了一些资料。将自己最终的代码分享在这里,以供自己日后查阅,如果能给陌生的你带来方便,那便更好。
开发的过程中也遇到了一个问题,设置字体会导致打开Excel时报错(错误:此文件中的某些文本格式可能已经更改,因为它已经超出最多允许的字体数),并且设置失败。这个问题产生的原因是因为频繁的创建字体,这个在我参考的代码中是有问题,我做了些改善。如果你有更优的方案,期待向你学习。
public class ExcelDAL ? ? { ? ? ? ? #region 定义单元格常用到样式的枚举 ? ? ? ? public enum stylexls ? ? ? ? { ? ? ? ? ? ? 头, ? ? ? ? ? ? 列标题, ? ? ? ? ? ? url, ? ? ? ? ? ? 时间, ? ? ? ? ? ? 数字, ? ? ? ? ? ? 钱, ? ? ? ? ? ? 百分比, ? ? ? ? ? ? 中文大写, ? ? ? ? ? ? 科学计数法, ? ? ? ? ? ? 默认 ? ? ? ? } ? ? ? ? #endregion ? ? ? ? //定义工作薄 ? ? ? ? private static IWorkbook m_workbook;? ? ? ? ? //定义sheet表 ? ? ? ? private static ISheet m_sheet; ? ? ? ? //表名 ? ? ? ? private static List<string> m_sheets=new List<string>(); ? ? ? ? private static ICellStyle m_cellStyle; ? ? ? ? private static IDataFormat m_datastyle; ? ? ? ? //字体 ? ? ? ? private static IFont m_font20; ? ? ? ? //字体 ? ? ? ? private static IFont m_font12; ? ? ? ? //字体 ? ? ? ? private static IFont m_font; ? ? ? ? /// <summary> ? ? ? ? /// 创建Excel表 ? ? ? ? /// </summary> ? ? ? ? /// <param name="dt">传递datatable数据类型</param> ? ? ? ? /// <param name="filePath">文件保存路径</param> ? ? ? ? /// <param name="sheetName">工作表名</param> ? ? ? ? /// <param name="headerName">表格标题名</param> ? ? ? ? /// <returns></returns> ? ? ? ? public static bool ExportExcel(System.Data.DataTable dt, string filePath, string sheetName,string headerName="考勤表") ? ? ? ? { ? ? ? ? ? ? ICellStyle cellstytle = null; ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //如果Excel存在就获取IWorkbook对象,否则就重新创建 ? ? ? ? ? ? ? ? if (File.Exists(filePath)) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); ? ? ? ? ? ? ? ? ? ? if (filePath.IndexOf(".xlsx") > 0) // 2007版本 ? ? ? ? ? ? ? ? ? ? ? ? m_workbook = new XSSFWorkbook(fs); ? ? ? ? ? ? ? ? ? ? else if (filePath.IndexOf(".xls") > 0) // 2003版本 ? ? ? ? ? ? ? ? ? ? ? ? m_workbook = new HSSFWorkbook(fs); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //创建一个工作簿 ? ? ? ? ? ? ? ? ? ? m_workbook = new HSSFWorkbook(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (m_workbook != null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //获取所有SheetName ? ? ? ? ? ? ? ? ? ? int count = m_workbook.NumberOfSheets; ? ? ? ? ? ? ? ? ? ? //如果该工作簿不存在表就创建新表 ? ? ? ? ? ? ? ? ? ? if (count < 1) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? //创建一个 sheet 表 ? ? ? ? ? ? ? ? ? ? ? ? m_sheet = m_workbook.CreateSheet(sheetName); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? m_sheets.Clear(); ? ? ? ? ? ? ? ? ? ? ? ? for (int i = 0; i < count; i++) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_sheet = m_workbook.GetSheetAt(i); ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_sheets.Add(m_sheet.SheetName); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? if(m_sheets.Contains(sheetName)) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_sheet = m_workbook.CreateSheet(sheetName+System.DateTime.Now.ToString("HH-mm-ss")+"副本"); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? m_sheet = m_workbook.CreateSheet(sheetName); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? #region 打印设置 ? ? ? ? ? ? ? ? m_sheet.PrintSetup.Copies = 3; ? ? ? ? ? ? ? ? m_sheet.PrintSetup.Landscape = false; ? ? ? ? ? ? ? ? m_sheet.PrintSetup.Scale = 100; ? ? ? ? ? ? ? ? //纸张设置,A4纸 ? ? ? ? ? ? ? ? m_sheet.PrintSetup.PaperSize = 9; ? ? ? ? ? ? ? ? //打印网格线 ? ? ? ? ? ? ? ? m_sheet.IsPrintGridlines = true; ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? ? #region 设置表头 ? ? ? ? ? ? ? ? m_sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, dt.Columns.Count-1)); //合并单元格 ? ? ? ? ? ? ? ? IRow row0 = m_sheet.CreateRow(0); ?//创建一行 ? ? ? ? ? ? ? ? row0.Height = 50 * 20; ? ? ? ? ? ? ? ? ICell icelltop0 = row0.CreateCell(0); ?//创建一个单元格 ? ? ? ? ? ? ? ? IFont font = m_workbook.CreateFont(); ? ? ? ? ? ? ? ? font.FontHeightInPoints = 30; ? ? ? ? ? ? ? ? icelltop0.CellStyle = Getcellstyle(m_workbook, stylexls.头); ? ? ? ? ? ? ? ? icelltop0.SetCellValue(headerName); ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? ? #region 设置列 ? ? ? ? ? ? ? ? IRow rowH = m_sheet.CreateRow(1); ? ? ? ? ? ? ? ? cellstytle= Getcellstyle(m_workbook, stylexls.列标题); ? ? ? ? ? ? ? ? //设置列名 ? ? ? ? ? ? ? ? foreach (DataColumn col in dt.Columns) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //创建单元格并设置单元格内容 ? ? ? ? ? ? ? ? ? ? rowH.CreateCell(col.Ordinal).SetCellValue(col.Caption); ? ? ? ? ? ? ? ? ? ? ? //设置单元格格式 ? ? ? ? ? ? ? ? ? ? rowH.Cells[col.Ordinal].CellStyle = cellstytle; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? #endregion ? ? ? ? ? ? ? ? ? //写入数据 ? ? ? ? ? ? ? ? cellstytle = Getcellstyle(m_workbook, stylexls.默认); ? ? ? ? ? ? ? ? for (int i = 0; i < dt.Rows.Count; i++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? //跳过前两行,第一行为标题,第二行为列名? ? ? ? ? ? ? ? ? ? ? IRow row = m_sheet.CreateRow(i + 2); ? ? ? ? ? ? ? ? ? ? ICell cell = row.CreateCell(0); ? ? ? ? ? ? ? ? ? ? for (int j = 0; j < dt.Columns.Count; j++) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? cell = row.CreateCell(j); ? ? ? ? ? ? ? ? ? ? ? ? cell.SetCellValue(dt.Rows[i][j].ToString()); ? ? ? ? ? ? ? ? ? ? ? ? cell.CellStyle = cellstytle; ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //获取当前列的宽度,然后对比本列的长度,取最大值 ? ? ? ? ? ? ? ? for (int columnNum = 0; columnNum <= dt.Rows.Count; columnNum++) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? int columnWidth = m_sheet.GetColumnWidth(columnNum) / 256; ? ? ? ? ? ? ? ? ? ? for (int rowNum = 1; rowNum <= m_sheet.LastRowNum; rowNum++) ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? IRow currentRow; ? ? ? ? ? ? ? ? ? ? ? ? //当前行未被使用过 ? ? ? ? ? ? ? ? ? ? ? ? if (m_sheet.GetRow(rowNum) == null) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? currentRow = m_sheet.CreateRow(rowNum); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? currentRow = m_sheet.GetRow(rowNum); ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? if (currentRow.GetCell(columnNum) != null) ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ICell currentCell = currentRow.GetCell(columnNum); ? ? ? ? ? ? ? ? ? ? ? ? ? ? int length = Encoding.Default.GetBytes(currentCell.ToString()).Length; ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (columnWidth < length) ? ? ? ? ? ? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? columnWidth = length + 10; ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? m_sheet.SetColumnWidth(columnNum, columnWidth * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(0, 30 * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(1, 10 * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(2, 25 * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(3, 25 * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(4, 10 * 256); ? ? ? ? ? ? ? ? ? ? //m_sheet.SetColumnWidth(5, 10 * 256); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? //创建文件 ? ? ? ? ? ? ? ? FileStream file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); ? ? ? ? ? ? ? ? ? //创建一个 IO 流 ? ? ? ? ? ? ? ? MemoryStream ms = new MemoryStream(); ? ? ? ? ? ? ? ? ? //写入到流 ? ? ? ? ? ? ? ? m_workbook.Write(ms); ? ? ? ? ? ? ? ? ? //转换为字节数组 ? ? ? ? ? ? ? ? byte[] bytes = ms.ToArray(); ? ? ? ? ? ? ? ? ? file.Write(bytes, 0, bytes.Length); ? ? ? ? ? ? ? ? file.Flush(); ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? //释放资源 ? ? ? ? ? ? ? ? bytes = null; ? ? ? ? ? ? ? ? ? ms.Close(); ? ? ? ? ? ? ? ? ms.Dispose(); ? ? ? ? ? ? ? ? ? file.Close(); ? ? ? ? ? ? ? ? file.Dispose(); ? ? ? ? ? ? ? ? ? m_workbook.Close(); ? ? ? ? ? ? ? ? m_sheet = null; ? ? ? ? ? ? ? ? m_workbook = null; ? ? ? ? ? ? ? ? m_cellStyle = null; ? ? ? ? ? ? ? ? m_datastyle = null; ? ? ? ? ? ? ? ? m_font = null; ? ? ? ? ? ? ? ? m_font12 = null; ? ? ? ? ? ? ? ? m_font20 = null; ? ? ? ? ? ? ? ? return true; ? ? ? ? ? ? } ? ? ? ? ? ? catch (Exception ex) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? return false; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #region 定义单元格常用到样式 ? ? ? ? static ICellStyle Getcellstyle(IWorkbook wb, stylexls str) ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //CreateFont()不能频繁创建,会导致打开EXCEL表的时候报如下错误: ? ? ? ? ? ? ? ? //此文件中的某些文本格式可能已经更改,因为它已经超出最多允许的字体数。 ? ? ? ? ? ? ? ? if (m_font20 == null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? m_font20 = wb.CreateFont(); ? ? ? ? ? ? ? ? ? ? m_font20.FontHeightInPoints = 20; ? ? ? ? ? ? ? ? ? ? m_font20.FontName = "微软雅黑"; ? ? ? ? ? ? ? ? ? ? m_font20.Boldweight = (short)FontBoldWeight.Bold; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (m_font12 == null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? m_font12 = wb.CreateFont(); ? ? ? ? ? ? ? ? ? ? m_font12.FontHeightInPoints = 12; ? ? ? ? ? ? ? ? ? ? m_font12.FontName = "微软雅黑"; ? ? ? ? ? ? ? ? ? ? m_font12.Boldweight = (short)FontBoldWeight.Bold; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (m_font == null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? m_font = wb.CreateFont(); ? ? ? ? ? ? ? ? ? ? m_font.FontName = "微软雅黑"; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? //if (m_cellStyle == null) ? ? ? ? ? ? ? ? //{ ? ? ? ? ? ? ? ? ? ? m_cellStyle = wb.CreateCellStyle(); ? ? ? ? ? ? ? ? ? ? //边框 ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Medium; ? ? ? ? ? ? ? ? ? ? m_cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Medium; ? ? ? ? ? ? ? ? ? ? m_cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Medium; ? ? ? ? ? ? ? ? ? ? m_cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Medium; ? ? ? ? ? ? ? ? ? ? //边框颜色 ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.BottomBorderColor = HSSFColor.OliveGreen.Blue.Index; ? ? ? ? ? ? ? ? ? ? m_cellStyle.TopBorderColor = HSSFColor.OliveGreen.Blue.Index; ? ? ? ? ? ? ? ? ? ? ? //背景图形 ? ? ? ? ? ? ? ? ? ? //cellStyle.FillBackgroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; ? ? ? ? ? ? ? ? ? ? ? //cellStyle.FillForegroundColor = HSSFColor.OLIVE_GREEN.BLUE.index; ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.FillForegroundColor = HSSFColor.White.Index; ? ? ? ? ? ? ? ? ? ? // cellStyle.FillPattern = FillPatternType.NO_FILL; ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.FillBackgroundColor = HSSFColor.Blue.Index; ? ? ? ? ? ? ? ? ? ? ? //水平对齐 ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; ? ? ? ? ? ? ? ? ? ? ? //垂直对齐 ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.VerticalAlignment = VerticalAlignment.Center; ? ? ? ? ? ? ? ? ? ? ? //自动换行 ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.WrapText = false; ? ? ? ? ? ? ? ? ? ? ? //缩进 ? ? ? ? ? ? ? ? ? ? //cellStyle.Indention = 0; ? ? ? ? ? ? ? ? //} ? ? ? ? ? ? ? ? //创建格式 ? ? ? ? ? ? ? ? if (m_datastyle == null) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? m_datastyle = wb.CreateDataFormat(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? //上面基本都是设共公的设置 ? ? ? ? ? ? ? ? ? //下面列出了常用的字段类型 ? ? ? ? ? ? ? ? ? switch (str) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? case stylexls.头: ? ? ? ? ? ? ? ? ? ? ? ? //cellStyle.FillPattern = FillPatternType.LEAST_DOTS; ? ? ? ? ? ? ? ? ? ? ? ? ? //设置为文本格式,也可以为 text,即 dataFormat.GetFormat("text"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = m_datastyle.GetFormat("@"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font20); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.列标题: ? ? ? ? ? ? ? ? ? ? ? ? // cellStyle.FillPattern = FillPatternType.LEAST_DOTS; ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = m_datastyle.GetFormat("@"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font12); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.时间: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = m_datastyle.GetFormat("yyyy/mm/dd"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.数字: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.钱: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = m_datastyle.GetFormat("¥#,##0"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.url: ? ? ? ? ? ? ? ? ? ? ? ? //IFont fontcolorblue = wb.CreateFont(); ? ? ? ? ? ? ? ? ? ? ? ? //fontcolorblue.Color = HSSFColor.OliveGreen.Blue.Index; ? ? ? ? ? ? ? ? ? ? ? ? //fontcolorblue.IsItalic = true;//下划线 ? ? ? ? ? ? ? ? ? ? ? ? ? fontcolorblue.Underline = 1; ? ? ? ? ? ? ? ? ? ? ? ? //fontcolorblue.FontName = "微软雅黑"; ? ? ? ? ? ? ? ? ? ? ? ? //m_cellStyle.SetFont(fontcolorblue); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.百分比: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.中文大写: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = m_datastyle.GetFormat("[DbNum2][$-804]0"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.科学计数法: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00"); ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? ? ? case stylexls.默认: ? ? ? ? ? ? ? ? ? ? ? ? m_cellStyle.SetFont(m_font); ? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? return m_cellStyle; ? ? ? ? ? ? } ? ? ? ? ? ? catch ? ? ? ? ? ? { ? ? ? ? ? ? ? ? return m_cellStyle; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? #endregion ? ? ? }
创建的表格的效果如图所示:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
查看更多关于基于NPOI用C#开发的Excel以及表格设置的详细内容...