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<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);
            }
        }
    }
}

*

*

*

*

*

*

相关推荐
诸葛大钢铁3 小时前
WORD压缩两个免费方法
word
小可的科研日常13 小时前
保持Word中插入图片的清晰度
word
小码ssim19 小时前
通过POI实现对word基于书签的内容替换、删除、插入
java·word
一把年纪学编程1 天前
【牛马技巧】word统计每一段的字数接近“字数统计”
前端·数据库·word
爱吃零食的白糖2 天前
word换行符和段落标记
word
Etincelle2 天前
【LaTeX】Word插入LaTeX行间公式如何编号和对齐
word·wps·latex
老马啸西风2 天前
sensitive-word-admin v2.0.0 全新 ui 版本发布!vue+前后端分离
vue.js·ui·ai·nlp·github·word
wqqqianqian3 天前
国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表
linux·前端·word·pageoffice
诸葛大钢铁4 天前
在线caj转换word
word