.NET Core使用NPOI导出复杂,美观的Excel详解
前言:
这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做数据导出Excel文档(当时想想真香,网上随便搜一搜教程一大堆),但是当自己真正的实践起来才知道原来想要给不同的单元格设置相关的字体样式、边框样式以及单元格样式一个简单的样式需要写这么多行代码来实现。作为一个喜欢编写简洁代码的我而言肯定是受不了的,于是乎提起袖子说干就干,我自己根据网上的一些资料自己封装了一个通用的NPOI导出Excel帮助类,主要包括行列创建,行内单元格常用样式封装(如:字体样式,字体颜色,字体大小,单元格背景颜色,单元格边框,单元格内容对齐方式等常用属性),希望在以后的开发中能够使用到,并且也希望能够帮助到更多有需要的同学。
一、引入NPOI NuGet:
NPOI GitHub源码地址:
版本说明:
NPOI 2.4.1 (注意不同版本可能使用的姿势有点小差别)
程序包管理器控制台输入一下命令安装:
Install-Package NPOI -Version 2.4.1
通过NuGet管理解决方案安装:
选择=>工具=>NuGet包管理器=>程序包管理器控制台:

搜索:NPOI进行安装:

二、导出Excel文档内容展示格式如下如所示:

三、CellStyle单元格常用样式概述:
HSSFCellStyle cellStyle = (HSSFCellStyle)workbook.CreateCellStyle(); //创建列头单元格实例样式
cellStyle.Alignment = hAlignment; //水平布局方式(HorizontalAlignment hAlignment)
cellStyle.VerticalAlignment = vAlignment; //垂直布局方式(VerticalAlignment vAlignment)
cellStyle.WrapText =false;//是否自动换行 //TODO:十分注意,要设置单元格背景色必须是FillForegroundColor和FillPattern两个属性同时设置,否则是不会显示背景颜色
//如下设置黄色背景色
cellStyle.FillForegroundColor = cellBackgroundColor;//单元格背景颜色(short cellBackgroundColor = HSSFColor.Yellow.Index)
cellStyle.FillPattern = fillPattern;//填充图案样式(FineDots 细点,SolidForeground立体前景,isAddFillPattern=true时存在(FillPattern fillPattern = FillPattern.SolidForeground) //设置单元格边框样式
//常用的边框样式 None(没有),Thin(细边框,瘦的),Medium(中等),Dashed(虚线),Dotted(星罗棋布的),Thick(厚的),Double(双倍),Hair(头发)[上右下左顺序设置]
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin; //设置单元格边框颜色[上右下左顺序设置]
cellStyle.TopBorderColor = HSSFColor.DarkGreen.Index;//DarkGreen(黑绿色)
cellStyle.RightBorderColor = HSSFColor.DarkGreen.Index;
cellStyle.BottomBorderColor = HSSFColor.DarkGreen.Index;
cellStyle.LeftBorderColor = HSSFColor.DarkGreen.Index;
四、Font字体常用属性概述:
var cellStyleFont = (HSSFFont)workbook.CreateFont();//创建字体对象实例
//假如字体大小只需要是粗体的话直接使用下面该属性即可
cellStyleFont.IsBold = true; //或者通过下面属性,设置字体weight来设置字体是否加粗
cellStyleFont.Boldweight = boldWeight; //字体加粗(字体加粗 (None = 0,Normal = 400,Bold = 700)
cellStyleFont.FontHeightInPoints = fontHeightInPoints; //字体大小(short fontHeightInPoints)
cellStyleFont.FontName = fontName;//字体(仿宋,楷体,宋体 )
cellStyleFont.Color = fontColor;//设置字体颜色(short fontColor = HSSFColor.Black.Index)
cellStyleFont.IsItalic =true;//是否将文字变为斜体(true是,false否)
cellStyleFont.Underline = underlineStyle;//字体下划线(下划线样式(无下划线[None],单下划线[Single],双下划线[Double],会计用单下划线[SingleAccounting],会计用双下划线[DoubleAccounting]))
cellStyleFont.TypeOffset = typeOffset;//字体上标下标(字体上标下标(普通默认值[None],上标[Sub],下标[Super]),即字体在单元格内的上下偏移量)
cellStyleFont.IsStrikeout =true;//是否显示删除线(true显示,false不显示)
五、NPOI HSSFColor 颜色索引对照表:
说明:通过对相关属性的介绍,我们可以清楚的知道无论是字体颜色,表格边框颜色,还是单元格背景颜色我们都需要用到HSSFColor对象中的颜色属性索引(该索引的字符类型为short类型)。
HSSFColor颜色索引对照表如下表所示:
表格来源:https://www.cnblogs.com/Brainpan/p/5804167.html (潘小博1992)
| 颜色 | Class名称(注意由于NPOI的版本原因,我们在使用对应Class名称时首字母可能需要小写) | short |
| Black | 8 | |
| Brown | 60 | |
| Olive_Green | 59 | |
| Dark_Green | 58 | |
| Dark_Teal | 56 | |
| Dark_Blue | 18 | |
| Indigo | 62 | |
| Grey_80_PERCENT | 63 | |
| Dark_Red | 16 | |
| Orange | 53 | |
| DARK_YELLOW | 19 | |
| Green | 17 | |
| Teal | 21 | |
| Blue | 12 | |
| Blue_Grey | 54 | |
| Grey_50_PERCENT | 23 | |
| Red | 10 | |
| LIGHT_ORANGE | 52 | |
| LIME | 50 | |
| SEA_GREEN | 57 | |
| AQUA | 49 | |
| LIGHT_BLUE | 48 | |
| VIOLET | 20 | |
| GREY_40_PERCENT | 55 | |
| Pink | 14 | |
| Gold | 51 | |
| Yellow | 13 | |
| BRIGHT_GREEN | 11 | |
| TURQUOISE | 15 | |
| SKY_BLUE | 40 | |
| Plum | 61 | |
| GREY_25_PERCENT | 22 | |
| Rose | 45 | |
| Tan | 47 | |
| LIGHT_YELLOW | 43 | |
| LIGHT_GREEN | 42 | |
| LIGHT_TURQUOISE | 41 | |
| PALE_BLUE | 44 | |
| LAVENDER | 46 | |
| White | 9 | |
| CORNFLOWER_BLUE | 24 | |
| LEMON_CHIFFON | 26 | |
| MAROON | 25 | |
| ORCHID | 28 | |
| CORAL | 29 | |
| ROYAL_BLUE | 30 | |
| LIGHT_CORNFLOWER_BLUE | 31 | |
| AUTOMATIC | 64 |
六、关于NPOI对Excel中的行列常用操作方法概述:
创建Excel工作表,给工作表赋一个名称(Excel底部名称):
var sheet = workbook.CreateSheet("人才培训课程表");

创建Excel中指定的行:
/// <summary>
/// TODO:先创建行,然后在创建对应的列
/// 创建Excel中指定的行
/// </summary>
/// <param name="sheet">Excel工作表对象</param>
/// <param name="rowNum">创建第几行(从0开始)</param>
/// <param name="rowHeight">行高</param>
public HSSFRow CreateRow(ISheet sheet, int rowNum, float rowHeight)
{
HSSFRow row = (HSSFRow)sheet.CreateRow(rowNum); //创建行
row.HeightInPoints = rowHeight; //设置列头行高
return row;
}
创建行内指定的单元格:
/// <summary>
/// 创建行内指定的单元格
/// </summary>
/// <param name="row">需要创建单元格的行</param>
/// <param name="cellStyle">单元格样式</param>
/// <param name="cellNum">创建第几个单元格(从0开始)</param>
/// <param name="cellValue">给单元格赋值</param>
/// <returns></returns>
public HSSFCell CreateCells(HSSFRow row, HSSFCellStyle cellStyle, int cellNum, string cellValue)
{
HSSFCell cell = (HSSFCell)row.CreateCell(cellNum); //创建单元格
cell.CellStyle = cellStyle; //将样式绑定到单元格
if (!string.IsNullOrWhiteSpace(cellValue))
{
//单元格赋值
cell.SetCellValue(cellValue);
} return cell;
}
指定合并的行列:
//TODO:关于Excel行列单元格合并问题(注意:合并单元格后,只需对第一个位置赋值即可)
/**
第一个参数:从第几行开始合并
第二个参数:到第几行结束合并
第三个参数:从第几列开始合并
第四个参数:到第几列结束合并
**/
CellRangeAddress region = new CellRangeAddress(0, 0, 0, 5);
sheet.AddMergedRegion(region); cell.SetCellValue("人才培训课程表");//TODO:顶部标题
设置单元格的列宽:
sheet.SetColumnWidth(单元格索引,1000);//设置对应列宽(单元格索引从0开始,后面接宽度)
七、NPOI生成Excel文档完整代码:
NPOI之Excel数据导出帮助类(创建Excel表格行列,设置行高,设置字体样式,单元格边框样式,单元格背景颜色和样式,单元格内容对齐方式等常用属性和样式封装):
/**
* Author:追逐时光
* Description:Npoi之Excel数据导出帮助类(创建Excel表格行列,设置行高,设置字体样式,单元格边框样式,单元格背景颜色和样式,单元格内容对齐方式等常用属性和样式封装)
* Description:2020年3月29日
*/
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util; namespace YY_Utility
{
public class NpoiExcelExportHelper
{
private static NpoiExcelExportHelper _exportHelper; public static NpoiExcelExportHelper _
{
get => _exportHelper ?? (_exportHelper = new NpoiExcelExportHelper());
set => _exportHelper = value;
} /// <summary>
/// TODO:先创建行,然后在创建对应的列
/// 创建Excel中指定的行
/// </summary>
/// <param name="sheet">Excel工作表对象</param>
/// <param name="rowNum">创建第几行(从0开始)</param>
/// <param name="rowHeight">行高</param>
public HSSFRow CreateRow(ISheet sheet, int rowNum, float rowHeight)
{
HSSFRow row = (HSSFRow)sheet.CreateRow(rowNum); //创建行
row.HeightInPoints = rowHeight; //设置列头行高
return row;
} /// <summary>
/// 创建行内指定的单元格
/// </summary>
/// <param name="row">需要创建单元格的行</param>
/// <param name="cellStyle">单元格样式</param>
/// <param name="cellNum">创建第几个单元格(从0开始)</param>
/// <param name="cellValue">给单元格赋值</param>
/// <returns></returns>
public HSSFCell CreateCells(HSSFRow row, HSSFCellStyle cellStyle, int cellNum, string cellValue)
{
HSSFCell cell = (HSSFCell)row.CreateCell(cellNum); //创建单元格
cell.CellStyle = cellStyle; //将样式绑定到单元格
if (!string.IsNullOrWhiteSpace(cellValue))
{
//单元格赋值
cell.SetCellValue(cellValue);
} return cell;
} /// <summary>
/// 行内单元格常用样式设置
/// </summary>
/// <param name="workbook">Excel文件对象</param>
/// <param name="hAlignment">水平布局方式</param>
/// <param name="vAlignment">垂直布局方式</param>
/// <param name="fontHeightInPoints">字体大小</param>
/// <param name="isAddBorder">是否需要边框</param>
/// <param name="boldWeight">字体加粗 (None = 0,Normal = 400,Bold = 700</param>
/// <param name="fontName">字体(仿宋,楷体,宋体,微软雅黑...与Excel主题字体相对应)</param>
/// <param name="isAddBorderColor">是否增加边框颜色</param>
/// <param name="isItalic">是否将文字变为斜体</param>
/// <param name="isLineFeed">是否自动换行</param>
/// <param name="isAddCellBackground">是否增加单元格背景颜色</param>
/// <param name="fillPattern">填充图案样式(FineDots 细点,SolidForeground立体前景,isAddFillPattern=true时存在)</param>
/// <param name="cellBackgroundColor">单元格背景颜色(当isAddCellBackground=true时存在)</param>
/// <param name="fontColor">字体颜色</param>
/// <param name="underlineStyle">下划线样式(无下划线[None],单下划线[Single],双下划线[Double],会计用单下划线[SingleAccounting],会计用双下划线[DoubleAccounting])</param>
/// <param name="typeOffset">字体上标下标(普通默认值[None],上标[Sub],下标[Super]),即字体在单元格内的上下偏移量</param>
/// <param name="isStrikeout">是否显示删除线</param>
/// <returns></returns>
public HSSFCellStyle CreateStyle(HSSFWorkbook workbook, HorizontalAlignment hAlignment, VerticalAlignment vAlignment, short fontHeightInPoints, bool isAddBorder, short boldWeight, string fontName = "宋体", bool isAddBorderColor = true, bool isItalic = false, bool isLineFeed = false, bool isAddCellBackground = false, FillPattern fillPattern = FillPattern.NoFill, short cellBackgroundColor = HSSFColor.Yellow.Index, short fontColor = HSSFColor.Black.Index, FontUnderlineType underlineStyle =
FontUnderlineType.None, FontSuperScript typeOffset = FontSuperScript.None, bool isStrikeout = false)
{
HSSFCellStyle cellStyle = (HSSFCellStyle)workbook.CreateCellStyle(); //创建列头单元格实例样式
cellStyle.Alignment = hAlignment; //水平居中
cellStyle.VerticalAlignment = vAlignment; //垂直居中
cellStyle.WrapText = isLineFeed;//自动换行 //背景颜色,边框颜色,字体颜色都是使用 HSSFColor属性中的对应调色板索引,关于 HSSFColor 颜色索引对照表,详情参考:https://www.cnblogs.com/Brainpan/p/5804167.html //TODO:引用了NPOI后可通过ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillPattern 为单元格背景色的填充样式 //TODO:十分注意,要设置单元格背景色必须是FillForegroundColor和FillPattern两个属性同时设置,否则是不会显示背景颜色
if (isAddCellBackground)
{
cellStyle.FillForegroundColor = cellBackgroundColor;//单元格背景颜色
cellStyle.FillPattern = fillPattern;//填充图案样式(FineDots 细点,SolidForeground立体前景)
} //是否增加边框
if (isAddBorder)
{
//常用的边框样式 None(没有),Thin(细边框,瘦的),Medium(中等),Dashed(虚线),Dotted(星罗棋布的),Thick(厚的),Double(双倍),Hair(头发)[上右下左顺序设置]
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
} //是否设置边框颜色
if (isAddBorderColor)
{
//边框颜色[上右下左顺序设置]
cellStyle.TopBorderColor = HSSFColor.DarkGreen.Index;//DarkGreen(黑绿色)
cellStyle.RightBorderColor = HSSFColor.DarkGreen.Index;
cellStyle.BottomBorderColor = HSSFColor.DarkGreen.Index;
cellStyle.LeftBorderColor = HSSFColor.DarkGreen.Index;
} /**
* 设置相关字体样式
*/
var cellStyleFont = (HSSFFont)workbook.CreateFont(); //创建字体 //假如字体大小只需要是粗体的话直接使用下面该属性即可
//cellStyleFont.IsBold = true; cellStyleFont.Boldweight = boldWeight; //字体加粗
cellStyleFont.FontHeightInPoints = fontHeightInPoints; //字体大小
cellStyleFont.FontName = fontName;//字体(仿宋,楷体,宋体 )
cellStyleFont.Color = fontColor;//设置字体颜色
cellStyleFont.IsItalic = isItalic;//是否将文字变为斜体
cellStyleFont.Underline = underlineStyle;//字体下划线
cellStyleFont.TypeOffset = typeOffset;//字体上标下标
cellStyleFont.IsStrikeout = isStrikeout;//是否有删除线 cellStyle.SetFont(cellStyleFont); //将字体绑定到样式
return cellStyle;
}
}
}
生成并保存指定的Excel文档内容:
using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using YY_Utility; namespace YY_Services
{
/// <summary>
/// Excel文档生成并保存操作类
/// </summary>
public class NpoiExcelOperationService
{
private static IHostingEnvironment _environment; public NpoiExcelOperationService(IHostingEnvironment iEnvironment)
{
_environment = iEnvironment;
} /// <summary>
/// Excel数据导出简单示例
/// </summary>
/// <param name="resultMsg">导出结果</param>
/// <param name="excelFilePath">保存excel文件路径</param>
/// <returns></returns>
public bool ExcelDataExport(out string resultMsg, out string excelFilePath)
{
var result = true;
excelFilePath = "";
resultMsg = "successfully";
//Excel导出名称
string excelName = "人才培训课程表";
try
{
//首先创建Excel文件对象
var workbook = new HSSFWorkbook(); //创建工作表,也就是Excel中的sheet,给工作表赋一个名称(Excel底部名称)
var sheet = workbook.CreateSheet("人才培训课程表"); //sheet.DefaultColumnWidth = 20;//默认列宽 sheet.ForceFormulaRecalculation = true;//TODO:是否开始Excel导出后公式仍然有效(非必须) #region table 表格内容设置 #region 标题样式 //设置顶部大标题样式
var cellStyleFont = NpoiExcelExportHelper._.CreateStyle(workbook, HorizontalAlignment.Center, VerticalAlignment.Center, , true, , "楷体", true, false, false, true, FillPattern.SolidForeground, HSSFColor.Coral.Index, HSSFColor.White.Index,
FontUnderlineType.None, FontSuperScript.None, false); //第一行表单
var row = NpoiExcelExportHelper._.CreateRow(sheet, , ); var cell = row.CreateCell();
//合并单元格 例: 第1行到第2行 第3列到第4列围成的矩形区域 //TODO:关于Excel行列单元格合并问题
/**
第一个参数:从第几行开始合并
第二个参数:到第几行结束合并
第三个参数:从第几列开始合并
第四个参数:到第几列结束合并
**/
CellRangeAddress region = new CellRangeAddress(, , , );
sheet.AddMergedRegion(region); cell.SetCellValue("人才培训课程表");//合并单元格后,只需对第一个位置赋值即可(TODO:顶部标题)
cell.CellStyle = cellStyleFont; //二级标题列样式设置
var headTopStyle = NpoiExcelExportHelper._.CreateStyle(workbook, HorizontalAlignment.Center, VerticalAlignment.Center, , true, , "楷体", true, false, false, true, FillPattern.SolidForeground, HSSFColor.Grey25Percent.Index, HSSFColor.Black.Index,
FontUnderlineType.None, FontSuperScript.None, false); //表头名称
var headerName = new[] { "课程类型", "序号", "日期", "课程名称", "内容概要", "讲师简介" }; row = NpoiExcelExportHelper._.CreateRow(sheet, , );//第二行
for (var i = ; i < headerName.Length; i++)
{
cell = NpoiExcelExportHelper._.CreateCells(row, headTopStyle, i, headerName[i]); //设置单元格宽度
if (headerName[i] == "讲师简介" || headerName[i] == "内容概要")
{
sheet.SetColumnWidth(i, );
}
else {
sheet.SetColumnWidth(i, );
} }
#endregion #region 单元格内容信息 //单元格边框样式
var cellStyle = NpoiExcelExportHelper._.CreateStyle(workbook, HorizontalAlignment.Center, VerticalAlignment.Center, , true, ); //左侧列单元格合并 begin
//TODO:关于Excel行列单元格合并问题(合并单元格后,只需对第一个位置赋值即可)
/**
第一个参数:从第几行开始合并
第二个参数:到第几行结束合并
第三个参数:从第几列开始合并
第四个参数:到第几列结束合并
**/
CellRangeAddress leftOne = new CellRangeAddress(, , , ); sheet.AddMergedRegion(leftOne); CellRangeAddress leftTwo = new CellRangeAddress(, , , ); sheet.AddMergedRegion(leftTwo); //左侧列单元格合并 end var currentDate = DateTime.Now; string[] curriculumList = new[] { "艺术学", "设计学", "材料学", "美学", "心理学", "中国近代史", "管理人员的情绪修炼", "高效时间管理", "有效的目标管理", "沟通与协调" }; int number = ; for (var i = ; i < ; i++)
{
row = NpoiExcelExportHelper._.CreateRow(sheet, i + , ); //sheet.CreateRow(i+2);//在上面表头的基础上创建行
switch (number)
{
case :
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , "公共类课程");
break;
case :
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , "管理类课程");
break;
} //创建单元格列公众类课程
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , number.ToString());
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , currentDate.AddDays(number).ToString("yyyy-MM-dd"));
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , curriculumList[i]);
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , "提升,充实,拓展自己综合实力");
cell = NpoiExcelExportHelper._.CreateCells(row, cellStyle, , "追逐时光_" + number + "号金牌讲师!"); number++;
}
#endregion #endregion string folder = DateTime.Now.ToString("yyyyMMdd"); //保存文件到静态资源文件夹中(wwwroot),使用绝对路径
var uploadPath = _environment.WebRootPath + "/UploadFile/" + folder + "/"; //excel保存文件名
string excelFileName = excelName + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; //创建目录文件夹
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
} //Excel的路径及名称
string excelPath = uploadPath + excelFileName; //使用FileStream文件流来写入数据(传入参数为:文件所在路径,对文件的操作方式,对文件内数据的操作)
var fileStream = new FileStream(excelPath, FileMode.OpenOrCreate, FileAccess.ReadWrite); //向Excel文件对象写入文件流,生成Excel文件
workbook.Write(fileStream); //关闭文件流
fileStream.Close(); //释放流所占用的资源
fileStream.Dispose(); //excel文件保存的相对路径,提供前端下载
var relativePositioning = "/UploadFile/" + folder + "/" + excelFileName; excelFilePath = relativePositioning;
}
catch (Exception e)
{
result = false;
resultMsg = e.Message;
}
return result;
} }
}
总结:
学习,工作,生活都一样,很多东西都需要我们自己动手去尝试我们才能真正的品尝到其中的味道,收获不一样的惊喜。本文主要是个人在工作和学习中的一些总结,希望能够帮助有需要的同学,别忘了给我star哟。
相关实例链接地址:
GitHub完整实例地址:
https://github.com/YSGStudyHards/NPOI-ExportWordAndExcel-ImportExcelData
.NET Core使用NPOI导出复杂,美观的Excel详解:
.NET Core使用NPOI导出复杂Word详解:
.NET Core使用NPOI将Excel中的数据批量导入到MySQL:
.NET Core使用NPOI导出复杂,美观的Excel详解的更多相关文章
- .NET Core使用NPOI导出复杂Word详解
前言: 最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第 ...
- ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解 1.1. 名词解释 1.2. Kestrel基本工作原理 1.2.1. Kestrel的基本架构 1.2.2. Ke ...
- [转帖]ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解 https://www.cnblogs.com/vipyoumay/p/7525478.html ASP.NET C ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
- NPOI导出多张图片到Excel
常用NPOI导出数据到excel,但没有试过如何导出图片.NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel.在单元格中插入图片主要是用HSSFClientAnchor对象.他有 ...
- .net core 实现npoi导出
Nuget 安装 NPOI 2.4.1 工作时间写着测试玩玩 public void ExportDataToExcel() { var workbook = new HSSFWorkbook(); ...
- 封装NPOI导出含下拉列表的Excel
/// <summary> /// 绑定数据的方法 /// </summary> /// <param name="ssfworkbook">H ...
- OpenGL 4.5 Core Profile管线(GLSL与应用程序接口详解)【未完成】
之前写过一篇博客,OpenGL管线(用经典管线代说着色器内部),说的主要是OpenGL的经典管线.大家都知道,现代OpenGL已经弃用(从OpenGL 3.0开始)经典管线功能(glBegin,变换矩 ...
- 【从零开始搭建自己的.NET Core Api框架】(五)由浅入深详解CORS跨域机制并快速实现
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
随机推荐
- Hexo之旅(四):文章编写技巧
hexo 编写文章可以使用以下命令创建hexo new "文件名" #创建的文章会在_pots目录下文章的后缀名是以md命名的文件格式,遵循markdown语法,所以编写文章可以使 ...
- Jprofile解析dump文件使用详解
1 Jprofile简介 官网 下载对应的系统版本即可 性能查看工具JProfiler,可用于查看java执行效率,查看线程状态,查看内存占用与内存对象,还可以分析dump日志. 2 功能简介 选择a ...
- Day 3 DP
1. P1015 精卫填海 01背包 + 判断 #include <iostream> using namespace std; , MAXV = ; int v, n, m, f[MAX ...
- 从头认识js-DOM1
前面说过一个完整的js实现,包括ECMAScript,BOM,DOM三部分,现在就来讲讲DOM的有关知识. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口).DOM描绘来一 ...
- Mac中使用brew安装mysql
若不考虑版本直接执行以下命令 brew install mysql 若要选择版本只要加上@版本即可,例如 brew install mysql@5.7 安装完后启动mysql mysql.server ...
- 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ZRjGGy 可交互视频 此视频是可 ...
- Nginx server name配置子域名二级域名
绑定子域名到不同目录(子站) 网站的目录结构为 /var/www/html: ├── fx └── blog└── photo html为nginx的默认网站目录. sudo vi /etc/ngin ...
- C#爬取微博文字、图片、视频(不使用Cookie)
前两天在网上偶然看到一个大佬OmegaXYZ写的文章,Python爬取微博文字与图片(不使用Cookie) 于是就心血来潮,顺手撸一个C#版本的. 其实原理也很简单,现在网上大多数版本都需要Cooki ...
- Python 第一天学习记录
- VUE四 axios详解
axios的中文文档写的已经很详细 https://www.kancloud.cn/yunye/axios/234845