最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Winform使用NPOI獲取Word內(nèi)容的實戰(zhàn)指南

 更新時間:2025年07月29日 08:38:23   作者:墨夶  
NPOI是用于讀寫Excel和Word的插件包,它是Apache POI的.NET版,總之,Apache POI是一個Java的強大的、開源的Office文檔處理包,而NPOI是它的.NET版本,所以本文給大家介紹了C# Winform使用NPOI獲取Word內(nèi)容的實戰(zhàn)指南,感興趣的小伙伴跟著小編一起來看看吧

為什么選擇NPOI?

NPOI核心優(yōu)勢

  1. 無需Office依賴:純.NET庫解析.doc/.docx
  2. 支持復(fù)雜結(jié)構(gòu):表格、段落、圖片、樣式全解析
  3. 高性能低內(nèi)存:比COM快5-10倍,內(nèi)存占用降低70%

模塊1:環(huán)境準(zhǔn)備與項目搭建

1.1 安裝NPOI庫:告別“Hello World”陷阱

“NuGet安裝后找不到類?90%的初學(xué)者都踩過這個坑!”

// Visual Studio NuGet命令行  
Install-Package NPOI -Version 2.5.4  
Install-Package NPOI.XWPF.UserModel -Version 2.5.4  
Install-Package NPOI.HWPF -Version 2.5.4  

關(guān)鍵點

  • HWPF:處理.doc(舊版Word)
  • XWPF:處理.docx(新版Word)
  • 版本匹配:確保項目.NET Framework ≥ 4.6

1.2 創(chuàng)建Winform窗體:從空白到功能按鈕

“按鈕點擊事件寫錯命名空間?看這里!”

// Form1.cs  
public partial class Form1 : Form  
{  
    public Form1()  
    {  
        InitializeComponent();  
        // 初始化按鈕  
        Button btnParse = new Button();  
        btnParse.Text = "解析Word";  
        btnParse.Location = new Point(50, 50);  
        btnParse.Click += BtnParse_Click;  
        this.Controls.Add(btnParse);  
    }  

    private void BtnParse_Click(object sender, EventArgs e)  
    {  
        try  
        {  
            OpenFileDialog openFileDialog = new OpenFileDialog();  
            openFileDialog.Filter = "Word文檔|*.doc;*.docx";  
            if (openFileDialog.ShowDialog() == DialogResult.OK)  
            {  
                string filePath = openFileDialog.FileName;  
                ParseWordDocument(filePath);  
            }  
        }  
        catch (Exception ex)  
        {  
            MessageBox.Show($"解析失?。簕ex.Message}");  
        }  
    }  
}

調(diào)試技巧

  • 異常捕獲:務(wù)必包裹try-catch,防止程序崩潰
  • 文件過濾:通過Filter屬性限定文件類型

模塊2:核心功能實現(xiàn)——段落與表格解析

2.1 讀取.docx文件:XWPFDocument的魔法

“段落遍歷卡在空行?你需要知道RowNum的隱藏規(guī)則!”

private void ParseWordDocument(string filePath)  
{  
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
    {  
        IWorkbook workbook = null;  
        if (filePath.EndsWith(".docx"))  
        {  
            workbook = new XSSFWorkbook(fs);  
        }  
        else if (filePath.EndsWith(".doc"))  
        {  
            workbook = new HSSFWorkbook(fs);  
        }  

        if (workbook != null)  
        {  
            foreach (ISheet sheet in workbook)  
            {  
                foreach (IRow row in sheet)  
                {  
                    foreach (ICell cell in row)  
                    {  
                        Console.WriteLine($"單元格內(nèi)容:{cell.ToString()}");  
                    }  
                }  
            }  
        }  
    }  
}

進(jìn)階優(yōu)化

  • 類型判斷:通過cell.CellType處理數(shù)字/日期
  • 樣式保留cell.GetCellStyle()獲取字體、顏色

2.2 提取表格數(shù)據(jù):嵌套循環(huán)的“陷阱”與“解藥”

“表格行數(shù)少1?RowNum從0開始計數(shù)的真相!”

private void ExtractTableData(XWPFDocument doc)  
{  
    foreach (XWPFTable table in doc.Tables)  
    {  
        Console.WriteLine("發(fā)現(xiàn)表格:");  
        for (int i = 0; i < table.Rows.Count; i++)  
        {  
            XWPFTableRow row = table.Rows[i];  
            for (int j = 0; j < row.Cells.Count; j++)  
            {  
                XWPFTableCell cell = row.Cells[j];  
                // 處理單元格中的段落  
                string cellText = string.Join("\n", cell.Paragraphs.Select(p => p.Text));  
                Console.WriteLine($"行{i}列{j}:{cellText}");  
            }  
        }  
    }  
}

關(guān)鍵技巧

  • 段落合并string.Join處理多段落單元格
  • 表格定位:通過table.GetCTTbl().GetPos()獲取位置信息

模塊3:高級功能——圖片與樣式提取

3.1 提取圖片:Base64編碼的“隱藏通道”

“圖片保存路徑錯誤?你需要絕對路徑+文件名哈希!”

private void ExtractImages(XWPFDocument doc, string outputDir)  
{  
    if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir);  

    int imageIndex = 0;  
    foreach (XWPFPictureData picture in doc.GetAllPictures())  
    {  
        string ext = GetImageExtension(picture.PictureType);  
        string imagePath = Path.Combine(outputDir, $"image_{imageIndex++}{ext}");  

        using (FileStream fs = new FileStream(imagePath, FileMode.Create))  
        {  
            picture.WriteImageContent(fs);  
            Console.WriteLine($"圖片已保存:{imagePath}");  
        }  
    }  
}  

private string GetImageExtension(int pictureType)  
{  
    switch (pictureType)  
    {  
        case 2: return ".jpg";  
        case 3: return ".png";  
        case 4: return ".gif";  
        default: return ".bin";  
    }  
}

注意事項

  • 格式識別PictureType可能返回未知類型
  • 內(nèi)存釋放using語句確保流正確關(guān)閉

3.2 保留樣式:字體、顏色的“克隆術(shù)”

“樣式丟失?你需要深入ICellStyle的每個屬性!”

private void PreserveStyles(ICell cell)  
{  
    ICellStyle style = cell.GetCellStyle();  
    Console.WriteLine($"字體:{style.Font.FontName}");  
    Console.WriteLine($"字號:{style.Font.FontSize}");  
    Console.WriteLine($"顏色:{style.FillForegroundColor}");  
    Console.WriteLine($"加粗:{style.Font.IsBold}");  
}

擴展應(yīng)用

  • 樣式映射:將Excel樣式轉(zhuǎn)換為HTML/CSS
  • 條件格式:根據(jù)背景色標(biāo)記重要數(shù)據(jù)

模塊4:實戰(zhàn)案例——從Word到數(shù)據(jù)庫的完整鏈路

4.1 數(shù)據(jù)映射實體類:字段命名的藝術(shù)

“數(shù)據(jù)庫字段命名混亂?用[Column]特性統(tǒng)一規(guī)范!”

[Table("WordData")]  
public class WordDataEntity  
{  
    [Key]  
    public int Id { get; set; }  

    [Column("OriginalText")]  
    public string Content { get; set; }  

    [Column("ExtractTime")]  
    public DateTime ExtractedAt { get; set; }  
}

EF Core配置

  • 自動遷移Add-Migration InitialCreate
  • 批量插入SaveChanges() vs BulkInsert

4.2 數(shù)據(jù)庫寫入:異步操作的“性能炸彈”

“同步阻塞導(dǎo)致UI卡頓?異步編程是關(guān)鍵!”

private async Task SaveToDatabaseAsync(List<WordDataEntity> data)  
{  
    using (var context = new WordDataContext())  
    {  
        context.WordData.AddRange(data);  
        await context.SaveChangesAsync();  
    }  
}

性能優(yōu)化

  • 批量提交:每100條數(shù)據(jù)提交一次
  • 連接池配置Pooling=true;Max Pool Size=200;

模塊5:異常處理與性能調(diào)優(yōu)

5.1 常見錯誤與解決方案

“文件損壞導(dǎo)致解析失敗?你需要健壯的異常處理!”

private void SafeParse(string filePath)  
{  
    try  
    {  
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
        {  
            if (filePath.EndsWith(".docx"))  
            {  
                var doc = new XWPFDocument(fs);  
                // 解析邏輯  
            }  
            else if (filePath.EndsWith(".doc"))  
            {  
                var doc = new HWPFDocument(fs);  
                // 解析邏輯  
            }  
        }  
    }  
    catch (IOException ex)  
    {  
        Console.WriteLine($"IO異常:{ex.Message}");  
    }  
    catch (InvalidDataException ex)  
    {  
        Console.WriteLine($"文件格式錯誤:{ex.Message}");  
    }  
}

日志記錄

  • SerilogLog.Information("解析開始")
  • 文件分級:按日期生成日志文件

5.2 內(nèi)存優(yōu)化:大型文檔的“瘦身術(shù)”

“500MB文檔導(dǎo)致內(nèi)存爆表?流式處理是關(guān)鍵!”

private void StreamParse(string filePath)  
{  
    using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
    {  
        if (filePath.EndsWith(".docx"))  
        {  
            using (var doc = new XWPFDocument(fs))  
            {  
                foreach (var para in doc.Paragraphs)  
                {  
                    ProcessParagraph(para);  
                }  
            }  
        }  
    }  
}

關(guān)鍵策略

  • 逐行處理:避免一次性加載全部內(nèi)容
  • 對象池:復(fù)用StringBuilder等對象

從入門到精通的“躍遷之路”

“掌握NPOI后,你的生產(chǎn)力直接提升10倍!”

核心思想

  • 分層架構(gòu):UI層、業(yè)務(wù)層、數(shù)據(jù)層分離
  • 異常防御:全面覆蓋所有可能錯誤場景
  • 性能優(yōu)先:異步處理+流式解析

進(jìn)階方向

  • OCR集成:處理掃描版PDF轉(zhuǎn)Word
  • RPA自動化:結(jié)合UIPath實現(xiàn)端到端流程
  • 微服務(wù)化:將解析功能封裝為REST API

終極目標(biāo)

  • 構(gòu)建企業(yè)級文檔處理平臺:支持Word/Excel/PDF多格式互轉(zhuǎn)

以上就是C# Winform使用NPOI獲取Word內(nèi)容的實戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于C# NPOI獲取Word內(nèi)容的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中使用IrisSkin2.dll美化WinForm程序界面的方法

    C#中使用IrisSkin2.dll美化WinForm程序界面的方法

    這篇文章主要介紹了c#中使用IrisSkin2.dll美化WinForm程序界面的實現(xiàn)方法,需要的朋友可以參考下
    2013-05-05
  • 使用C#實現(xiàn)在Excel中高效生成和操作表格

    使用C#實現(xiàn)在Excel中高效生成和操作表格

    在日常工作中,Excel不僅僅是一個電子表格工具,它還提供了強大的表格功能,幫助我們高效地管理、分析和展示數(shù)據(jù),隨著數(shù)據(jù)量的增加,手動操作這些表格變得越來越繁瑣,通過編程,我們可以自動化這些操作,利用C#在Excel中創(chuàng)建、管理和優(yōu)化表格功能,需要的朋友可以參考下
    2025-11-11
  • C#中Trace.Assert的使用小結(jié)

    C#中Trace.Assert的使用小結(jié)

    Trace.Assert是.NET中的運行時斷言檢查工具,用于驗證代碼中的關(guān)鍵條件,下面就來詳細(xì)的介紹一下Trace.Assert的使用,具有一定的參考價值,感興趣的可以了解一下
    2025-12-12
  • C#實現(xiàn)Nginx平滑加權(quán)輪詢算法

    C#實現(xiàn)Nginx平滑加權(quán)輪詢算法

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)Nginx平滑加權(quán)輪詢算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • WPF自動隱藏的消息框的實例代碼

    WPF自動隱藏的消息框的實例代碼

    本文給大家介紹WPF自動隱藏的消息框?qū)嵗a,當(dāng)鼠標(biāo)放上去將一直顯示,移開動畫繼續(xù),提供normal和error兩種邊框。非常不錯,具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-07-07
  • C#面向?qū)ο缶幊讨欣锸咸鎿Q原則的示例詳解

    C#面向?qū)ο缶幊讨欣锸咸鎿Q原則的示例詳解

    在面向?qū)ο缶幊讨?,SOLID?是五個設(shè)計原則的首字母縮寫,旨在使軟件設(shè)計更易于理解、靈活和可維護。本文將通過實例詳細(xì)講講C#面向?qū)ο缶幊讨欣锸咸鎿Q原則,需要的可以參考一下
    2022-07-07
  • Unity如何獲取Texture內(nèi)存大小方法詳解

    Unity如何獲取Texture內(nèi)存大小方法詳解

    這篇文章主要為大家介紹了Unity如何獲取Texture內(nèi)存大小方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C#使用AForge實現(xiàn)調(diào)用攝像頭的示例詳解

    C#使用AForge實現(xiàn)調(diào)用攝像頭的示例詳解

    AForge是一個專門為開發(fā)者和研究者基于C#框架設(shè)計的,這個框架提供了不同的類庫和關(guān)于類庫的資源,本文為大家介紹了C#使用AForge實現(xiàn)調(diào)用攝像頭的相關(guān)教程,需要的可以了解下
    2023-11-11
  • C#中緩存System.Web.Caching用法總結(jié)

    C#中緩存System.Web.Caching用法總結(jié)

    本文詳細(xì)講解了C#中緩存System.Web.Caching的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 淺析C#封裝GRPC類庫及調(diào)用簡單實例

    淺析C#封裝GRPC類庫及調(diào)用簡單實例

    這篇文章主要為大家詳細(xì)介紹了C#中封裝GRPC類庫及調(diào)用簡單實例的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評論

鄂托克前旗| 岗巴县| 长武县| 衡水市| 中西区| 桂平市| 新余市| 烟台市| 基隆市| 保德县| 虞城县| 毕节市| 襄垣县| 密云县| 枣庄市| 宣恩县| 东阿县| 松阳县| 南召县| 元谋县| 太白县| 玛纳斯县| 襄樊市| 宝山区| 武平县| 东辽县| 景谷| 宜宾市| 衢州市| 临江市| 江油市| 济阳县| 江永县| 沁源县| 荃湾区| 陵川县| 清苑县| 旺苍县| 夏河县| 太谷县| 石楼县|