2020年6月9日 星期二

[研究][C#][ASP.NET] 用 NPOI 替換 Word (.docx) 中的文字

[研究][C#][ASP.NET] 用 NPOI 替換 Word (.docx) 中的文字

2020-06-09

Visual Studio 2019 v16.6.1 + C# + ASP.NET + WebForm + WebApplication 

建立 C:\Temp\Test.docx 檔案,裡面放一個字串 {$name}
本程式會把該字串替換掉。

NuGet 安裝 NPOI 元件。

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
Inherits="WordDocxReplaceByNPOI.Default" %>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </div>
    </form>
</body>
</html>


Default.aspx.cs

using System;
using System.IO;

namespace WordDocxReplaceByNPOI
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            // 限制 Word 2007 或以上的 .docx文件
            FileStream fs = new FileStream(@"C:\Temp\test.docx", FileMode.Open, FileAccess.Read);
            NPOI.XWPF.UserModel.XWPFDocument myDocx = new NPOI.XWPF.UserModel.XWPFDocument(fs); 
            
            foreach (var para in myDocx.Paragraphs)
            {
                string oldtext = para.ParagraphText;
                string newText = "趙錢孫";
                if (oldtext == "")
                    continue;
                string temptext = para.ParagraphText;
                //以下為替換文件模版中的關鍵字
                if (temptext.Contains("{$name}"))
                    temptext = temptext.Replace("{$name}", newText);
                para.ReplaceText(oldtext, temptext);
            }

            FileStream output = new FileStream(@"C:\Temp\test2.docx", FileMode.Create);
            myDocx.Write(output);
            fs.Close();
            fs.Dispose();
            output.Close();
            output.Dispose();
        }
    }
}


測試

(下圖) 原始內容

(下圖) 替換結果


2020-06-15 補充,在 "樣張1.docx" 上使用,出現錯誤



把  "樣張1.docx" 改名  "樣張1.docx.zip",解壓,用IE11檢視 /word/document.xml,沒有錯誤訊息。
把  "樣張2.docx" 改名  "樣張2.docx.zip",解壓,用IE11檢視 /word/document.xml,沒有錯誤訊息。
兩者的結構是有些不同,但 IE11 檢視都沒有報錯誤,暫時不知如何解。

也就是程式無法試用於各種 .docx 情況。

(完)

相關

[研究][C#][ASP.NET] 用 NPOI 替換 Word (.docx) 中的文字

[研究][C#][ASP.NET] 用 DocXCore 1.0.7 ( Novacode ) 替換 Word (.docx) 中的文字

[研究][C#][ASP.NET] 用 DocX 1.6.0 ( Xceed Words for .NET) 替換 Word (.docx) 中的文字


1 則留言: