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
IRowNPOI.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 的部分属性如下

属性类型描述可选值
Heightshort行高单位是 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 的部分属性如下

属性类型描述可选值
FontNamestring字体类型微软雅黑,宋体
FontHeightInPointsdouble字号Excel表格中是多少字号此处就填什么,例:12
Colorshort字体颜色HSSFColor.Red.Index
IsBoldbool加粗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); // 清除缓存
}
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C#中的NPOI库来创建和写入Excel文件。下面是一个简单的示例代码,演示了如何使用NPOI创建一个Excel文件,并将数据写入到文件中: ```csharp using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Util; using System.IO; public void ExportToExcel(string filePath) { // 创建一个Workbook对象,表示整个Excel文件 IWorkbook workbook = new HSSFWorkbook(); // 创建一个Sheet对象,表示Excel中的一个Sheet ISheet sheet = workbook.CreateSheet("Sheet1"); // 创建第一行,并写入表头数据 IRow headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("姓名"); headerRow.CreateCell(1).SetCellValue("年龄"); headerRow.CreateCell(2).SetCellValue("性别"); // 写入数据行 for (int i = 0; i < data.Count; i++) { IRow dataRow = sheet.CreateRow(i + 1); dataRow.CreateCell(0).SetCellValue(data[i].Name); dataRow.CreateCell(1).SetCellValue(data[i].Age); dataRow.CreateCell(2).SetCellValue(data[i].Gender); } // 调整列宽 sheet.AutoSizeColumn(0); sheet.AutoSizeColumn(1); sheet.AutoSizeColumn(2); // 将Workbook保存为Excel文件 using (FileStream fs = new FileStream(filePath, FileMode.Create)) { workbook.Write(fs); } } ``` 以上代码创建了一个名为"Sheet1"的工作表,并在第一行写入了表头数据。然后,使用循环将数据写入到数据行中。最后,将Workbook保存为Excel文件。 在使用该代码之前,你需要在项目中引用NPOI库,并在代码中引入相应的命名空间。此外,你可能需要根据自己的需求修改代码以适应你的数据结构和文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值