中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#如何使用NPOI對word進行讀寫

發布時間:2022-06-09 09:58:44 來源:億速云 閱讀:367 作者:iii 欄目:開發技術

這篇文章主要介紹了C#如何使用NPOI對word進行讀寫的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C#如何使用NPOI對word進行讀寫文章都會有所收獲,下面我們一起來看看吧。

    一、簡介

    操作Word的類庫:

    • NPOI: V2.5.1 

    • DocX(屬于Xceed Words for .NET的免費版本)

    • Aspose.Words: 收費

    • Spire.Doc: 收費

    二、簡單使用

    1、XWPFDocument類的實例化

    該類的實例對應一個word文檔 

    XWPFDocument MyDoc = new XWPFDocument();

    2、設置頁面的大小

    如果不進行頁面大小的設置,默認是縱向的A4大小。橫向的A4的頁面大小 ,如果要縱向,寬高兩個值調換即可。

    T_SectPr m_SectPr = new CT_SectPr();       //實例一個尺寸類的實例
    m_SectPr.pgSz.w = 16838;        //設置寬度(這里是一個ulong類型)
    m_SectPr.pgSz.h = 11906;        //設置高度(這里是一個ulong類型)
    MyDoc.Document.body.sectPr = m_SectPr;          //設置頁面的尺寸

    這里的單位比較特殊,用的是緹(Twip)這是一種和屏幕無關的長度單位,目的是為了讓應用程序元素輸出到不同設備時都能保持一致的計算方式。

    換算關系:

    • 1英寸=1440緹

    • 1厘米=567緹

    • 1磅=20緹

    • 1像素=15緹

    常用頁面尺寸:(單位Twip)

    • A4(縱向):W=11906 H=16838

    • A4(縱向):W=16838 H=11906

    • A5 : W=8390 H=11906

    • A6 : W=5953 H=8390

    示例:控制word頁內邊距

    //創建document對象
    var doc = new XWPFDocument();
    doc.Document.body.sectPr = new CT_SectPr();
    CT_SectPr m_SectPr = doc.Document.body.sectPr;
    m_SectPr.pgSz.h = (ulong)16838;
    m_SectPr.pgSz.w = (ulong)11906;
    //頁面邊距
    m_SectPr.pgMar.left = (ulong)800;//左邊距
    m_SectPr.pgMar.right = (ulong)800;//右邊距
    m_SectPr.pgMar.top = "850";//上邊距
    m_SectPr.pgMar.bottom = "850";//下邊距

    3、段落處理

    創建段落

    段落為XWPFParagraph類型的實例,段落由XWPFDocument實例的使用CreateParagraph()方法生成。

    XWPFParagraph MyParagraph = MyDoc.CreateParagraph();

    該段落類有很多屬性,用于設置與段落相關的內容。主要有以下幾個方面

    • BorderXXXXX屬性:該值用于設置邊界的樣式。該屬性用于獲取或設置一個Borders枚舉類型的值,

    • FillBackgroundColor屬性:背景填充的顏色。該屬性獲取或設置一個string類型的變量。該變量的含義是某個顏色的RGB值(在NPOI里所有的顏色都是以這種形式表示的)。例如設置為黑色則對應的代碼如下:

      MyParagraph.FillBackgroundColor = "#000000";
    • Alignment屬性:段落的對齊方式。該屬性獲取或設置一個ParagraphAlignment的枚舉值。

    • VerticalAlignment屬性:文本垂直方向的對齊方式。該屬性獲取或設置一個TextAlignment 的枚舉值。

    • IndentationFirstLine屬性:用于設置段落的首行縮進。該屬性獲取或設置一個int型變量。 
      這個int值并不是縮進的字數,這里可以用一個函數計算縮進的距離。

    //段落縮進   返回值為對應的縮進距離
    //(fontname:文字類型名稱   fontsize:文字大小    fontcount:縮進數目 fontstyle:文字類型(斜體、粗體...))
    int Indentation(String fontname, int fontsize, int fontnum, FontStyle fontstyle)
    {
        Graphics gp = this.CreateGraphics();
        gp.PageUnit = GraphicsUnit.Point;
        SizeF size = gp.MeasureString("字", new Font(fontname, fontsize * 0.75F, fontstyle));
        return (int)size.Width * fontnum * 10;
    }

    示例:創建段落

    var paragraph = doc.CreateParagraph();
    paragraph.Alignment = ParagraphAlignment.CENTER; //字體居中
    var run = paragraph.CreateRun();
    run.IsBold = true;
    run.SetText(contend);
    run.FontSize = 28;
    run.SetFontFamily("黑體", FontCharRange.None); //設置黑體
    //控制段落與其他元素的上下距離
    paragraph.SpacingBeforeLines = 20;//上方距離
    paragraph.SpacingAfterLines = 20;//下方距離

    換頁(本頁未滿直接寫下一頁)

    paragraph = doc.CreateParagraph();
    paragraph.CreateRun().AddBreak(BreakType.PAGE);

    文本處理

    • doc.Paragraphs 獲取到文檔里的所有的段落對象;

    • para.ParagraphText 獲取段落的文本數據;

    • para.ReplaceText(要被替換的文本,替換文本) 替換段落的文本(模板能實現的關鍵)

    4、表格處理

    doc.Tables 獲取文檔里的所有的表格對象;//doc.Tables獲取的只是Word中最外層的表格,不包含嵌套內層的。 
    cell.Tables;//獲取嵌套單元格可使用 
    row.Rows //獲取表格所有行; 
    row.GetTableICells() ;//獲取表格行的所有單元格; 
    獲取到單元格之后就可以獲取單元格里的文本段落(Paragraphs)并且進行文本替換

    創建表格

    var table = doc.CreateTable(行數, 列數);
    table.Width = 5000;

    控制表格中列寬(這里需要注意,只設置一行的列寬一旦插入文字就會使設置的列寬失效,所以要把每一個單元格都要設置上)

    for (int r = 0; r < 8; r++)
    {
          SetCellWith(table.GetRow(r).GetCell(0), "600");
          SetCellWith(table.GetRow(r).GetCell(1), "1500");
          SetCellWith(table.GetRow(r).GetCell(2), "1500");
          SetCellWith(table.GetRow(r).GetCell(3), "600");
     }

    設置表格中單元格豎直居中

    var rowcell = table.GetRow(r).GetCell(c);
    rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);

    設置單元格內容

    //table中的文字格式設置
    var para = new CT_P();
    var pCell = new XWPFParagraph(para, table.Body);
    pCell.Alignment = paragraphAlignment; //字體居中
    pCell.VerticalAlignment = TextAlignment.CENTER; //字體居中
    
    var r1c1 = pCell.CreateRun();
    r1c1.SetText(setText);
    r1c1.FontSize = 11;
    r1c1.SetFontFamily("宋體", FontCharRange.None); //設置雅黑字體
    pCell.SpacingAfterLines = 40;
    pCell.SpacingBeforeLines = 40;
    //放入單元格
    table.GetRow(4).GetCell(1).SetParagraph(pCell);

    表格中換行

    var run= paragraph.CreateRun();
    run.SetText(contends[i]);
    run.FontSize = 11;
    run.SetFontFamily("宋體", FontCharRange.None); 
    run.AddBreak(BreakType.TEXTWRAPPING);//換行

    合并單元格

    table.GetRow(rowIndex).MergeCells(fromCol, toCol);//合并列

    水平合并行單元格

    CT_Tc cttcofRowThird = cell.GetCTTc();
    CT_TcPr ctProfRowThird = cttcofRowThird.AddNewTcPr();
    ctProfRowThird.gridSpan = new CT_DecimalNumber();
    ctProfRowThird.gridSpan.val = num.ToString();//合并num列

    合并行、垂直合并列單元格

    public void MYMergeRows(XWPFTable table, int fromRow, int toRow, int colIndex)
    {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++)
        {
            XWPFTableCell rowcell = table.GetRow(rowIndex).GetCell(colIndex);
            rowcell.SetVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
            CT_Tc cttc = rowcell.GetCTTc();
            CT_TcPr ctTcPr = cttc.tcPr;
            if (ctTcPr == null)
            {
                ctTcPr = cttc.AddNewTcPr();
            }
    
            if (rowIndex == fromRow)
            {
                // The first merged cell is set with RESTART merge value
                ctTcPr.AddNewVMerge().val = ST_Merge.restart;
            }
            else
            {
                // Cells which join (merge) the first one, are set with CONTINUE
                ctTcPr.AddNewVMerge().val = ST_Merge.@continue;//繼續合并行
            }
            ctTcPr.AddNewVAlign().val = ST_VerticalJc.center;//垂直
        }
    }

    5、頁眉頁腳處理

    XWPFDocument doc = new XWPFDocument();
    doc.Document.body.sectPr = new CT_SectPr();
    CT_SectPr m_SectPr = doc.Document.body.sectPr;
    
    //創建頁眉
    CT_Hdr m_Hdr = new CT_Hdr();
    CT_P m_P = m_Hdr.AddNewP();
    m_P.AddNewR().AddNewT().Value = "頁眉內容值";
    m_P.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中
                                                    //創建頁眉關系(headern.xml)
    XWPFRelation Hrelation = XWPFRelation.HEADER;
    XWPFHeader m_h = (XWPFHeader)doc.CreateRelationship(Hrelation, XWPFFactory.GetInstance(), doc.HeaderList.Count + 1);
    doc.CreateFootnotes();
    
    //設置頁眉
    m_h.SetHeaderFooter(m_Hdr);
    CT_HdrFtrRef m_HdrFtr = m_SectPr.AddNewHeaderReference();
    m_h.GetRelationById(m_HdrFtr.id);
    
    //創建頁腳
    CT_Ftr m_ftr = new CT_Ftr();
    CT_P m_fP = m_ftr.AddNewP();
    m_fP.AddNewR().AddNewT().Value = "頁腳內容值";
    m_fP.AddNewPPr().AddNewJc().val = ST_Jc.center;// 頁眉居中
                                                    //創建頁腳關系(footern.xml)
    XWPFRelation Frelation = XWPFRelation.FOOTER;
    XWPFFooter m_f = (XWPFFooter)doc.CreateRelationship(Frelation, XWPFFactory.GetInstance(), doc.FooterList.Count + 1);
    
    //設置頁腳
    m_f.SetHeaderFooter(m_ftr);
    m_HdrFtr = m_SectPr.AddNewFooterReference();
    m_HdrFtr.type = ST_HdrFtr.@default;
    m_f.GetRelationById(m_HdrFtr.id);

    三、綜合示例

    CT_SectPr srcpr = new CT_SectPr();
    //設置A4紙縱向,如果要橫向,兩個值調換即可
    srcpr.pgSz.w = (ulong)11906;
    srcpr.pgSz.h = (ulong)16838;
    
    XWPFDocument doc = new XWPFDocument();
    doc.Document.body.sectPr = srcpr;
    //輸出標題
    XWPFParagraph ptitle = doc.CreateParagraph();
    ptitle.Alignment = ParagraphAlignment.CENTER;
    XWPFRun titlerun = ptitle.CreateRun(); //向該段落中添加文字
    titlerun.SetText("標題");
    titlerun.IsBold = true;
    titlerun.FontFamily = "華文行楷";
    titlerun.FontSize = 30;
    titlerun.SetColor("blue");
    
    //輸出一個段落
    XWPFParagraph p2 = doc.CreateParagraph();
    p2.Alignment = ParagraphAlignment.CENTER;
    p2.IndentationFirstLine = (int)100; //首行縮進
    XWPFRun r2 = p2.CreateRun();
    r2.SetText(string.Format("生成時間:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")));
    r2.FontSize = 15;
    titlerun.FontFamily = "宋體";
    
    StringBuilder sb = new StringBuilder();
    using (FileStream stream = File.OpenRead("simple.docx"))
    {
        XWPFDocument docx = new XWPFDocument(stream);
    
        //頁眉
        foreach (XWPFHeader xwpfHeader in docx.HeaderList)
        {
            sb.AppendLine(string.Format("{0}", new string[] { xwpfHeader.Text }));
        }
    
        //頁腳
    
        foreach (XWPFFooter xwpfFooter in docx.FooterList)
        {
            sb.AppendLine(string.Format("{0}", new string[] { xwpfFooter.Text }));
        }
    
        //讀取段落
        foreach (var para in docx.Paragraphs)
        {
            string text = para.ParagraphText; //獲得文本
            var runs = para.Runs;
            // string styleid = para.Style;
            for (int i = 0; i < runs.Count; i++)
            {
                var run = runs[i];
                text = run.ToString(); //獲得run的文本
                sb.Append(text + ",");
            }
        }
        //讀取表格
        foreach (XWPFTable table in docx.Tables)
        {
            //循環表格行
            foreach (XWPFTableRow row in table.Rows)
            {
                foreach (XWPFTableCell cell in row.GetTableCells())
                {
                    sb.Append(cell.GetText());
                }
            }
        }
    
        //讀取圖片
        foreach (XWPFPictureData pictureData in docx.AllPictures)
        {
            string picExtName = pictureData.SuggestFileExtension();
            string picFileName = pictureData.FileName;
            byte[] picFileContent = pictureData.Data;
    
            string picTempName = string.Format(Guid.NewGuid().ToString() + "_" + picFileName + "." + picExtName);
    
            using (FileStream fs = new FileStream(picTempName, FileMode.Create, FileAccess.Write))
            {
                fs.Write(picFileContent, 0, picFileContent.Length);
                fs.Close();
            }
    
            sb.AppendLine(picTempName);
        }
    
        Console.WriteLine(sb.ToString());
    }
    
    FileStream out1 = new FileStream("simple.docx", FileMode.Create);
    doc.Write(out1);
    out1.Close();

    四、參考

    Word與Excel字號對照表

    C#如何使用NPOI對word進行讀寫

    關于“C#如何使用NPOI對word進行讀寫”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C#如何使用NPOI對word進行讀寫”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    彭阳县| 尼玛县| 本溪| 朝阳县| 乌苏市| 宝兴县| 江都市| 秦安县| 富裕县| 凤冈县| 青海省| 鄂伦春自治旗| 修武县| 长白| 宜丰县| 娄底市| 赫章县| 塔城市| 嘉黎县| 乌什县| 西畴县| 华阴市| 会理县| 商河县| 桐城市| 秦皇岛市| 怀仁县| 台东县| 林芝县| 深圳市| 新沂市| 贵德县| 德化县| 昌平区| 双峰县| 玛纳斯县| 莒南县| 水城县| 乌鲁木齐县| 涪陵区| 普兰店市|