基本的概念
XWPFDocument:初始化docx文档
XWPFParagraph:文档、表格、标题等各种的段落,由多个XWPFRun组成
XWPFRun:样式文本
XWPFTable:表格
XWPFTableRow:表格的一行
XWPFTableCell:表格的一个单元格
XWPFChar:表示.docx文件中的图表
XWPFHyperlink:表示超链接
XWPFPictureData:图片
XWPFComment :批注
XWPFHeaderFooterPolicy:页眉页脚策略
XWPFHeader:页眉
XWPFFooter:页脚
XWPFStyles:样式(设置多级标题的时候用)
管理 NuGet 程序包
# word操作
NPOI
# 图片操作
SkiaSharp
Controller代码
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<IActionResult> 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<WaterData> WaterDataList = new List<WaterData>();
/// 读取上传文档保存到文件流
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();
}
/// <summary>
/// 复制段落样式等属性
/// </summary>
/// <param name="srcRun">源</param>
/// <param name="destRun">目标</param>
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; // 浮雕
}
/// <summary>
/// 页眉页脚
/// </summary>
/// <param name="doc"></param>
/// <param name="headerText"></param>
/// <param name="footerText"></param>
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"); // 设置颜色(黑色)
}
}
/// <summary>
/// 插入图片
/// </summary>
/// <param name="para"></param>
/// <param name="imgpath"></param>
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);
}
}
}
}
*
*
*
*
*
*