最近在项目中需要导出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){//获取所有SheetNameint 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以及表格设置相关推荐

  1. 基于FPGA的密码锁开发——(3)密码设置模块驱动

    *在第一篇密码锁驱动开发完之后,就可以构思密码设置驱动了 需求如下: 1.要准确输入6位密码,输入位数不足就判定密码设置失败 2.只有在解锁状态下可以进行密码修改 3.在密码设置完成后要通知到密码锁模 ...

  2. NPOI 修改已存在的excel文件,设置第一行行高

    FileStream fileStream = new FileStream(@FileName, FileMode.Open, FileAccess.Read); FileStream fileSt ...

  3. 自动化办公:2、Python自动化之Excel读取表格+设置样式

    Python自动化之Excel 方法一:应用pip执行命令 安装openpyxl模块pip install openpyxl 方法二:在Pycharm中:File->Setting->左侧 ...

  4. 基于NPOI导入导出excel的工具,方便灵活

    ExcelCtr使用说明 源码:https://github.com/jackletter/ExcelCtr.Standard 一.概述 基于NPOI的一种导出Excel工具,访问数据库操作依赖于DB ...

  5. CATIA软件VBA二次开发:Excel文件中点坐标数据导入与生成点应用程序编写

    本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注! 前几期为大家介绍了基于VBA二次开发的CATIA软件焊点坐标数据导出应用程序编写以及焊点小球生成工具应用程 ...

  6. 动画图解:Excel字符格式设置

    动画图解:Excel字符格式设置 1.设置字体:选中需要设置字体的单元格(区域),鼠标按"格式"工具栏的"字体"框右侧的下拉按钮,在随后弹出的下拉列表中,选择需 ...

  7. C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中

    导出数据到Excel表格以及从Excel表格中读取数据是我们日常开发很多情况都会遇到的,这里或许只是导出一些简单的数据到excel,这里或许会按照一定的模板导出数据到excel,这里也可能需要从Exc ...

  8. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续2篇-模板导出综合示例)...

    自ExcelUtility类推出以来,经过项目中的实际使用与不断完善,现在又做了许多的优化并增加了许多的功能,本篇不再讲述原理,直接贴出示例代码以及相关的模板.结果图,以便大家快速掌握,另外这些示例说 ...

  9. 一个基于C#开发的Excel转Json工具

    Json在程序开发中是非常常用的数据格式,对于程序员来说,阅读和编辑Json都没有什么问题,但其他人就不是那么方便了.比如配置游戏数据:游戏角色.技能.道具的名称,策划书往往都是通过Excel配置,这 ...

最新文章

  1. 【转】初等数论 ——原根、指标及其应用
  2. socket第三方库 AsyncSocket(源码注释解读.转)
  3. 我国大型数据中心占比已达12.7%,大而不强成制约因素
  4. 51nod1227-平均最小公倍数【杜教筛,欧拉函数】
  5. 光纤耦合角度_一种光纤准直器的耦合找光方法与流程
  6. 别说我不懂排序!几种常见排序算法(一)
  7. linux 系统性能分析常用命令
  8. Mybatis框架中Oracle使用BLOB字段存储图片并展示(详细步骤)
  9. 将轻松的留给生活,沉重的留给写作——读《灯下尘》(七堇年)
  10. Ubuntu配置locale
  11. 免费的B站短链生成器,将链接转成b23.tv
  12. 《如何设计一个秒杀系统》——专栏笔记
  13. 如何求指定数字在数组中第一次出现的位置
  14. 牛客(中兴捧月)—B-切绳子
  15. Java之父找工作都被拒?我们普通人如何自救?
  16. InkSpace制作简易logo----家
  17. PaddleOCR 文字检测部分源码学习(1)
  18. 项目文章 | 缓解高胆固醇血症 ,浒苔多糖如何相助?
  19. 试试以下的瘦腰运动减肥吧,根据不同粗腰类型,减去腰部赘肉,让你也做一回小腰...
  20. 中国无线可穿戴扬声器行业市场供需与战略研究报告

热门文章

  1. 计算机操作系统教程——存储管理的功能
  2. IT十年人生过客-二十-转型电商
  3. 京东方android面试经验,京东方面试经验
  4. UE4通过SteamAudio实现3D立体声(HRTF)
  5. node-gyp环境配置报错处理,nodejs 调用 c++接口
  6. 02.App与Web测试
  7. 宝付跨境电商不断创建,呈现支付多元化
  8. 娃儿一周的“智能国际象棋”使用体验,最后谈谈激发热情这件事
  9. [计算机网络] 子网划分(详解)一个自治系统有5个局域网,其连接图如图所示。LAN2至LAN5上的主机数分别为91,150,3和15。该自治系统分配到的IP地址块为30.138.118/23。试...
  10. Linux scp命令 复制远程文件和目录到本地