NPOI高效生成Excel和Word

1、什么是NPOI

NPOI是POI库的 .NET版本,十分强大的一个.NET库,这是一个开源项目旨在帮助开发人员在不依赖Microsoft Office组件的情况下,直接读写Office格式的文档。

目前支持的文档格式有如下:

  • Excel:xls和xlsx
  • Word:doc和docx
  • PowerPoint:ppt和pptx

核心功能

  • 创建新的Excel或Word文档
  • 读取现有文档
  • 修改文档内容
  • 单元格格式化
  • 支持图表生成
  • ……

安装NPOI的nuget包

InStall-Package NPOI

2、Excel

1、引用命名空间

using NPOI.HSSF.UserModel;  // 用于.xls格式
using NPOI.XSSF.UserModel;  // 用于.xlsx格式
using NPOI.SS.UserModel;    // 公共接口

2、主要流程

using(var workbook = new XSSFWorkBook()) //创建工作薄
{
    //创建工作表
    ISheet sheet = workbook.CreateSheet("sheet1");
    //创建行
    IRow row = sheet.CreateRow(0);
    //创建单元格
    ICell cell = row.CreateCell(0);
    cell.SetCellValue("hello world");
    
    using (var ms = new MemoryStream())
    {
        workbook.Write(ms);
        return ms.ToArray();
    }
}

通过上所述步骤,就可以开始使用npoi去创建一个十分简单的excel文件了,但是在实际情况中这样的excel文件可以不能满足我们的需求,可能还需要去对excel的单元格进行合并、设置字体字号的需求,接下来是对npoi创建文件的一些进阶操作

//创建单元格样式
var style = workbook.CreateCellStyle();
// 设置背景色
style.FillForegroundColor = IndexedColors.LightYellow.Index;
style.FillPattern = FillPattern.SolidForeground;
//设置字体为居中
style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
//设置为粗体
var Font = workbook.CreateFont();
Font.FontHeightInPoints = 20;
Font.Boldweight = (short)FontBoldWeight.Bold;
style.SetFont(Font);

//应用到单元格
cell.CellStyle = style
//公式
cell.SetCellFormula("SUM(A1:A10)");
    
//设置列宽    
sheet.SetColumnWidth(i, 20 * 256);
//合并单元格
sheet.AddMergedRegion(new CellRangeAddress(0,0,0,5));//(开始行,结束行,开始列,结束列)

图表创建

	// 创建图表
    IDrawing drawing = sheet.CreateDrawingPatriarch();
	//图标位置,前四个是起始单元格的偏移量,后四个是结束单元格的位置
    IClientAnchor anchor = drawing.CreateAnchor(0, 0, 0, 0, 0, 5, 10, 15);
    //创建图表对象
    IChart chart = drawing.CreateChart(anchor);
	//创建图表图例
    IChartLegend legend = chart.GetOrCreateLegend();
    legend.Position = LegendPosition.TopRight;
    
    // 创建折线图数据
    ILineChartData<double, double> data = chart.ChartDataFactory.CreateLineChartData<double, double>();
    
    // 创建轴
    IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
    IChartAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
    leftAxis.Crosses = AxisCrosses.AutoZero;
	// 加数据
	IChartDataSource<string> xs = DataSources.FromStringCellRange(sheet, new CellRangeAddress(1, 2, 0, 0));
    IChartDataSource<double> ys = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(1, 2, 1, 1));
	chart.Plot(data,bottomAxis,leftAxis)

3、Word

1、引用命名空间

using NPOI.XWPF.UserModel;

2、使用流程

    using (XWPFDocument doc = new XWPFDocument())
    {
        // 创建段落
        XWPFParagraph p1 = doc.CreateParagraph();
        //设置这一段的属性
        XWPFRun r1 = p1.CreateRun();
        r1.SetText("这是第一个段落");
        r1.IsBold = true;        // 加粗
        r1.FontSize = 12;        // 字体大小
        r1.SetFontFamily("宋体"); // 字体
        r1.SetColor("FF0000"); //字体颜色

        // 创建第二个段落
        XWPFParagraph p2 = doc.CreateParagraph();
        XWPFRun r2 = p2.CreateRun();
        r2.SetText("这是第二个段落");
        //返回字节流
        using (var ms = new MemoryStream())
        {
            workbook.Write(ms);
            return ms.ToArray();
        }
    }

以上就是创建一个word文档的简单流程

进阶更多属性

        // 创建段落
        XWPFParagraph p1 = doc.CreateParagraph();
        //设置这一段的属性
        XWPFRun r1 = p1.CreateRun();
        //控制段落与其他元素的上下距离
        p1.SpacingBeforeLines = 20;
        p1.SpacingAfterLines = 20;

        // 设置段落对齐方式(可选)
        p1.Alignment = ParagraphAlignment.CENTER;
        // 下划线
        r1.UnderlinePatterns = UnderlinePatterns.Single; // 单下划线
        r1.UnderlinePatterns = UnderlinePatterns.Double; // 双下划线

        // 删除线
        r1.IsStrikeThrough = true; // 删除线
        //换行
        r1.AddBreak(); 

word中插入图片

XWPFRun run = paragraph.CreateRun();
using (FileStream picStream = new FileStream("image.png", FileMode.Open))
{
    run.AddPicture(
        picStream,//图片流
        (int)PictureType.PNG,//图片类型,.JPEG .GIF .TIFF .BMP .PNG
        "image.png", //文件名
        Units.ToEMU(200), // 宽度
        Units.ToEMU(100)  // 高度
    );
}
posted @ 2025-01-16 15:21  yinhe6  阅读(41)  评论(0)    收藏  举报