NPOI 操作 Word 文档

基本的概念

XWPFDocument:初始化docx文档

XWPFParagraph:文档、表格、标题等各种的段落,由多个XWPFRun组成

XWPFRun:样式文本

XWPFTable:表格

XWPFTableRow:表格的一行

XWPFTableCell:表格的一个单元格

XWPFChar:表示.docx文件中的图表

XWPFHyperlink:表示超链接

XWPFPictureData:图片

XWPFComment :批注

XWPFHeaderFooterPolicy:页眉页脚策略

XWPFHeader:页眉

XWPFFooter:页脚

XWPFStyles:样式(设置多级标题的时候用)

管理 NuGet 程序包

bash

复制代码

# word操作

NPOI

# 图片操作

SkiaSharp

Controller代码

cs

复制代码

using Microsoft.AspNetCore.Mvc;

using NPOI.Util;

using NPOI.XWPF.Model;

using NPOI.XWPF.UserModel;

using SkiaSharp;

namespace WebApplication2.Controllers

{

[Route("api/Npoi/[action]")]

[ApiController]

public class NpoiController : ControllerBase

{

public NpoiController() { }

[HttpPost("import")]

public async Task Import(IFormFile file)

{

/// 创建文件夹

var fileFolder = Path.Combine("File", "ExcelTemp");

if (!Directory.Exists(fileFolder))

Directory.CreateDirectory(fileFolder);

string filePath = string.Empty;

string[] LimitPictureType = { ".DOC", ".DOCX" };

/// 获取word文档后缀是否存在数组中

string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper();

if (LimitPictureType.Contains(currentPictureExtension))

{

List WaterDataList = new List();

/// 读取上传文档保存到文件流

var fileName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}{Path.GetExtension(file.FileName)}";

var fileNameNew = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}New{Path.GetExtension(file.FileName)}";

filePath = Path.Combine(fileFolder, fileName);

using (var stream = new FileStream(filePath, FileMode.Create))

{

await file.CopyToAsync(stream);

}

/// 读取文档内容

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))

{

XWPFDocument doc = new XWPFDocument(fs);

/// 文档内容

var body = doc.BodyElements.Count;

/// 段落总数总数

var paragraphs = doc.Paragraphs.Count;

/// 表格总数

var tables = doc.Tables.Count;

/// 图片总数

var pictures = doc.AllPictures.Count;

/// 循环文档中的所有段落

/// 注意图片会当做文本,只是text是空

if (paragraphs > 0)

{

for (int i = 0; i < paragraphs; i++)

{

var paragraph = doc.Paragraphs[i];

var text = paragraph.Text;

}

//foreach (XWPFParagraph paragraph in doc.Paragraphs)

//{

// /// 获取段落的文本内容

// string paragraphText = paragraph.Text;

// var style = paragraph.Style;

//}

}

/// 循环table表格内容

if (tables > 0)

{

for (int i = 0; i < tables; i++)

{

XWPFTable table = doc.Tables[i];

if (table.ElementType == BodyElementType.TABLE)

{

var rows = table.NumberOfRows;

for (int j = 1; j < table.Rows.Count; j++)

{

var waterData = new WaterData();

var tableCells = table.Rows[j].GetTableCells();

waterData.name = tableCells[0].GetText();

waterData.date = tableCells[1].GetText();

waterData.wl = tableCells[2].GetText();

waterData.fr = tableCells[3].GetText();

waterData.source = "";

WaterDataList.Add(waterData);

}

}

}

}

/// 循环图片内容

if (pictures > 0)

{

for (int i = 0; i < pictures; i++)

{

XWPFPictureData picData = doc.AllPictures[i];

}

}

/// 修改文档内容,添加 n个 新段落

XWPFParagraph new_p1 = doc.CreateParagraph();

XWPFRun run1 = new_p1.CreateRun();

run1.AddBreak(); // 添加换行符

run1.SetText("这是新段落:第1行。");

XWPFParagraph new_p2 = doc.CreateParagraph();

XWPFRun run2 = new_p2.CreateRun();

run2.AddBreak(); // 添加换行符

run2.SetText("这是新段落:第2行");

#region 复制段落1,并添加到新文档中

// 复制段落,并添加到新文档中

XWPFParagraph new_copy_p3 = doc.CreateParagraph();

foreach (var run in doc.Paragraphs[1].Runs)

{

XWPFRun newCopyRun = new_copy_p3.CreateRun();

newCopyRun.SetText(run.Text); // 设置文本内容

newCopyRun.FontFamily = run.FontFamily; // 复制字体家族

newCopyRun.FontSize = run.FontSize; // 复制字体大小

newCopyRun.IsBold = run.IsBold; // 复制粗体样式

newCopyRun.IsItalic = run.IsItalic; // 复制斜体样式

newCopyRun.Underline = run.Underline; // 复制下划线样式

newCopyRun.SetColor(run.GetColor()); // 复制字体颜色

}

#endregion

#region 复制段落2,并添加到新文档中

XWPFParagraph new_copy_p4 = doc.CreateParagraph();

foreach (var run in doc.Paragraphs[1].Runs)

{

XWPFRun destRun = new_copy_p4.CreateRun();

CopyRunStyle(run, destRun);

}

#endregion

#region 插入图片

// 图片路径

string imagePath = @"E:\107.png";

XWPFParagraph new_image_p5 = doc.CreateParagraph();

XWPFRun imageP5Run = new_image_p5.CreateRun();

InsertImg(imageP5Run, imagePath, "aaaa.jpg");

#endregion

#region 复制段落图片

/// 创建一个段落

XWPFParagraph new_image_p6 = doc.CreateParagraph();

XWPFRun imageP6Run = new_image_p6.CreateRun();

XWPFPictureData picture = doc.AllPictures[0];

/// 复制方式1

imageP6Run.AddPicture(new MemoryStream(picture.Data), picture.GetPictureType(), picture.FileName, 100 * 9525, 100 * 9525);

/// 复制方式2

byte[] pictureData = IOUtils.ToByteArray(picture.GetPackagePart().GetInputStream()); // 获取图片数据

imageP6Run.AddPicture(new MemoryStream(pictureData), picture.GetPictureType(), picture.FileName, 100 * 9525, 100 * 9525);

foreach (var item in doc.BodyElements)

{

if (item.ElementType == BodyElementType.PARAGRAPH)

{

var paragraph = (XWPFParagraph)item;

foreach (var itemSon in paragraph.Runs)

{

var tempPic = itemSon.GetEmbeddedPictures();

if (tempPic != null && tempPic.Count > 0)

{

}

}

}

}

#endregion

/// 页眉页脚

CreateHeaderFooter(doc, "页眉内容", "页脚内容");

// 保存到新文档

using (FileStream outStream = new FileStream(fileNameNew, FileMode.Create, FileAccess.Write))

{

doc.Write(outStream);

}

}

}

return Ok();

}

///

/// 复制段落样式等属性

///

///

/// 目标

private void CopyRunStyle(XWPFRun srcRun, XWPFRun destRun)

{

destRun.SetText(srcRun.Text); // 设置文本内容

destRun.FontFamily = srcRun.FontFamily; // 字体类型

destRun.FontSize = srcRun.FontSize; // 字体大小

destRun.IsBold = srcRun.IsBold; // 粗体样式

destRun.IsItalic = srcRun.IsItalic; // 斜体样式

destRun.Underline = srcRun.Underline; // 下划线类型

destRun.SetStrike(srcRun.IsStrike); // 是否删除线

destRun.IsStrikeThrough = srcRun.IsStrikeThrough; // 是否删除线

destRun.SetColor(srcRun.GetColor()); // 字体颜色

destRun.IsCapitalized = srcRun.IsCapitalized;

destRun.TextPosition = srcRun.TextPosition; // 文本位置

destRun.IsShadowed = srcRun.IsShadowed; // 阴影

destRun.IsEmbossed = srcRun.IsEmbossed; // 浮雕

}

///

/// 页眉页脚

///

///

///

///

private void CreateHeaderFooter(XWPFDocument doc, string headerText, string footerText)

{

/// 添加页眉页脚策略

XWPFHeaderFooterPolicy headerFooterPolicy = doc.CreateHeaderFooterPolicy();

if (!string.IsNullOrWhiteSpace(headerText))

{

/// 添加页眉

XWPFHeader header = headerFooterPolicy.CreateHeader(XWPFHeaderFooterPolicy.DEFAULT);

XWPFParagraph headerParagraph = header.CreateParagraph();

headerParagraph.VerticalAlignment = TextAlignment.CENTER;

headerParagraph.Alignment = ParagraphAlignment.CENTER; // 居中对齐

headerParagraph.BorderBottom = Borders.Single; // 边线

XWPFRun headerRun = headerParagraph.CreateRun();

headerRun.SetText(headerText); // 设置页脚文本

//headerRun.SetFontFamily("Arial", FontCharRange.None); // 设置字体

//headerRun.IsBold = true; // 设置粗体

//headerRun.SetColor("000000"); // 设置颜色(黑色)

}

if (!string.IsNullOrWhiteSpace(footerText))

{

// 添加页脚

XWPFFooter footer = headerFooterPolicy.CreateFooter(XWPFHeaderFooterPolicy.DEFAULT);

XWPFParagraph footerParagraph = footer.CreateParagraph();

footerParagraph.VerticalAlignment = TextAlignment.CENTER;

footerParagraph.Alignment = ParagraphAlignment.CENTER; // 居中对齐

footerParagraph.BorderBottom = Borders.Single; // 边线

XWPFRun footerRun = footerParagraph.CreateRun();

footerRun.SetText(footerText); // 设置页脚文本

//footerRun.SetFontFamily("Arial", FontCharRange.None); // 设置字体

//footerRun.IsBold = true; // 设置粗体

//footerRun.SetColor("000000"); // 设置颜色(黑色)

}

}

///

/// 插入图片

///

///

///

private void InsertImg(XWPFRun run, string imgpath, string imgName)

{

int width = 100;

int height = 100;

using (var imageData = SKImage.FromEncodedData(imgpath))

{

if (imageData != null)

{

width = imageData.Width;

height = imageData.Height;

}

}

using (FileStream fsImg = new FileStream(imgpath, FileMode.OpenOrCreate, FileAccess.Read))

{

/// 长和宽必须乘上9525

run.AddPicture(fsImg, (int)NPOI.XWPF.UserModel.PictureType.PNG, fsImg.Name, width * 9525, height * 9525);

}

}

}

}

*

*

*

*

*

*

随便看看