C# NPOI 创建Excel

C# NPOI 创建Excel

NPOI是一个供给C#操作导入或导出Excel的开源工具

.NET版本:.NET 5
NPOI版本:2.6.0

基本使用思路

  1. 创建工作薄(Workbook)
  2. 工作薄(Workbook)中创建工作表(WorkSheet)
  3. 工作表(WorkSheet)中创建行(Row)
  4. 行(Row)中创建单元格(Cell)

基本类

类名 描述 命名空间
IWorkbook 工作薄 NPOI.SS.UserModel
ISheet 工作表 NPOI.SS.UserModel
IRow NPOI.SS.UserModel
ICell 单元格 NPOI.SS.UserModel

IWorkbook 工作薄

IWorkbook 为创建的工作薄对象,一切工作薄内的操作都源自于它。

创建工作薄,代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
IWorkbook workbook_xls = new HSSFWorkbook();    // 创建.xls工作薄

这里用到了两个不同的方法来创建Excel工作薄

方法名 命名空间
XSSFWorkbook() NPOI.XSSF.UserModel
HSSFWorkbook() NPOI.HSSF.UserModel

ISheet 工作表

ISheet 为创建的工作表对象,Excel要求一个工作薄内至少要有一个工作表。

创建工作表代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称

这里使用到了工作薄的一个方法 CreateSheet(string sheetName),sheetName为创建的工作表的名称。

合并单元格

合并单元格操作需要在工作表中进行,这里使用到了这个方法

ISheet.AddMergedRegion(new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastRow))
属性 描述
firstRow 起始行,从0开始
lastRow 结束行
firstCol 起始列,从0开始
lastCol 结束列

示例代码如下

using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称

sheet.AddMergedRegion(new CellRangeAddress(0, 1, 0, 0));    // 合并A1和A2单元格

部分方法如下

方法 描述 参数描述
SetColumnWidth(int columnIndex, int width) 设置列宽度 columnIndex:设置的列,从0开始
width:设置的宽度,1/256 个点

IRow 行

IRow 为工作表创建的行对象

创建行代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称
IRow row = sheet.CreateRow(0);  // 创建第1行,参数为第几行

这里使用到了工作表的一个方法 CreateRow(int rownum),rownum为创建的行,从0开始。

IRow 的部分属性如下

属性 类型 描述 可选值
Height short 行高 单位是 1/20 个点

ICell 单元格

ICell 为行创建的单元格对象

创建单元格,代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称
IRow row = sheet.CreateRow(0);  // 创建第1行,参数为第几行

cell = row.CreateCell(0);   // 创建第1行的第1个单元格,参数为第几列

这里使用到了行的一个方法 CreateCell(int column),column为创建的列,从0开始。

单元格 方法

方法名 描述
SetCellValue(bool value) 给单元格赋值,赋布尔值
SetCellValue(string value) 给单元格赋值,赋字符串值
SetCellValue(IRichTextString value) 给单元格赋值,赋字符串值
SetCellValue(DateTime value) 给单元格赋值,赋日期值
SetCellValue(double value) 给单元格赋值,赋浮点数值

单元格 样式

样式

样式只能应用于单元格,所以只能在创建单元格后才能生效,且样式属性需要由工作薄生成。

单元格 ICell 有一个属性为CellStyle,通过给它赋值来操纵单元格的样式。

创建单元格样式,代码如下

// 创建样式
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;   // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin;    // 左边框

将设置好的单元格样式赋值到单元格中,代码如下

cell.CellStyle = style; // 设置单元格的样式

完整示例代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称
IRow row = sheet.CreateRow(0);  // 创建第1行,参数为第几行

// 创建样式
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;   // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin;    // 左边框

cell = row.CreateCell(0);   // 创建第1行的第1个单元格,参数为第几列

cell.CellStyle = style; // 设置单元格的样式

字体

字体只能应用于样式,且需要由工作薄生成。

创建字体,代码如下

// 创建字体
IFont font = workbook.CreateFont();
font.FontName = "微软雅黑";

将设置好的字体给到样式,代码如下

style.SetFont(font);    // 设置字体

完整示例代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称
IRow row = sheet.CreateRow(0);  // 创建第1行,参数为第几行

// 创建字体
IFont font = workbooko_xlsx.CreateFont();
font.FontName = "微软雅黑";

// 创建样式
ICellStyle style = workbooko_xlsx.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;   // 水平对齐
style.VerticalAlignment = VerticalAlignment.Center; // 垂直对齐
style.BorderLeft = BorderStyle.Thin;    // 左边框

style.SetFont(font);    // 设置字体

cell = row.CreateCell(0);   // 创建第1行的第1个单元格,参数为第几列

cell.CellStyle = style; // 设置单元格的样式

IFont 的部分属性如下

属性 类型 描述 可选值
FontName string 字体类型 微软雅黑,宋体
FontHeightInPoints double 字号 Excel表格中是多少字号此处就填什么,例:12
Color short 字体颜色 HSSFColor.Red.Index
IsBold bool 加粗 true / false

数据格式化

数据格式化需要从工作薄(Workbook)中创建

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄
ISheet sheet = workbooko_xlsx.CreateSheet("工作表1");   // 参数为工作表名称
IRow row = sheet.CreateRow(0);  // 创建第1行,参数为第几行


// 创建数据格式化
IDataFormat dataFormat = workbook_xlsx.CreateDataFormat();

// 创建样式
ICellStyle style = workbooko_xlsx.CreateCellStyle();
style.DataFormat = dataFormat.GetFormat("#-###-###-##");    // 具体的自定义格式可查看Excel内容

cell = row.CreateCell(0);   // 创建第1行的第1个单元格,参数为第几列

cell.CellStyle = style; // 设置单元格的样式

在导出的Excel中碰到了自定义格式不生效的问题,示例中的样式“#-###-###-##”需要生效的话需要将单元格设置为数字类型,字符串样式是不生效的。

导出文件

导出文件流

导出文件流,示例代码如下

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
using Microsoft.AspNetCore.Mvc;

public IActionResult GetExcel()
{
    IWorkbook workbook_xlsx = new XSSFWorkbook();    // 创建.xlsx工作薄

    // 省略填充工作薄的流程
    // ...

    // 开始写入文件流
    using MemoryStream ms = new();
    workbook_xlsx.Write(ms, true);
    byte[] bytes = ms.ToArray();

    return new FileContentResult(bytes, "application/vnd.ms-excel")
    {
        FileDownloadName = "下载的文件名.xlsx"
    };
}

前端接收文件流

这里以Vue3和axios为例

前端进行请求

import axios from "axios";

/** 
 * post方法,对应post请求 
 * @param {String} url 请求的url地址
 * @param {Object} params 请求时携带的参数]
 */
function postGetFile (url, params) {
    return new Promise((resolve, reject) => {
        axios.post(url, params, {
            "responseType": "blob",
        }).then(res => {
            resolve(res);
        }).catch(err => {
            reject(err.data);
        })
    });
}

function getFile () {
    let url = "#";  // 这里存放对应的url
    let params = {};    // 这里存放请求的参数

    let res = await postGetFile(url, params);
    
    // 模拟下载
    let downloadA = document.createElement("a");
    let blob = new Blob([ res.data ], { type: "application/vnd.ms-excel" });
    downloadA.href = window.URL.createObjectUrl(blob);
    downloadA.download = "你要下载的文件名.xlsx";
    downloadA.click();
    window.URL.revokeObjectURL(downloadA.href); // 清除缓存
}

你可能感兴趣的:(c#,excel)