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

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

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

為什么選擇NPOI?

NPOI核心優(yōu)勢(shì)

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

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

1.1 安裝NPOI庫(kù):告別“Hello World”陷阱

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

// 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)鍵點(diǎn)

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

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

“按鈕點(diǎn)擊事件寫(xiě)錯(cuò)命名空間?看這里!”

// 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,防止程序崩潰
  • 文件過(guò)濾:通過(guò)Filter屬性限定文件類(lèi)型

模塊2:核心功能實(shí)現(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)化

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

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

“表格行數(shù)少1?RowNum從0開(kāi)始計(jì)數(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處理多段落單元格
  • 表格定位:通過(guò)table.GetCTTbl().GetPos()獲取位置信息

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

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

“圖片保存路徑錯(cuò)誤?你需要絕對(duì)路徑+文件名哈希!”

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

注意事項(xiàng)

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

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

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

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

擴(kuò)展應(yīng)用

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

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

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

“數(shù)據(jù)庫(kù)字段命名混亂?用[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配置

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

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

“同步阻塞導(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 常見(jiàn)錯(cuò)誤與解決方案

“文件損壞導(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($"文件格式錯(cuò)誤:{ex.Message}");  
    }  
}

日志記錄

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

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)鍵策略

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

從入門(mén)到精通的“躍遷之路”

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

核心思想

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

進(jìn)階方向

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

終極目標(biāo)

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    WPF自動(dòng)隱藏的消息框的實(shí)例代碼

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

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

    在面向?qū)ο缶幊讨?,SOLID?是五個(gè)設(shè)計(jì)原則的首字母縮寫(xiě),旨在使軟件設(shè)計(jì)更易于理解、靈活和可維護(hù)。本文將通過(guò)實(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實(shí)現(xiàn)調(diào)用攝像頭的示例詳解

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

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

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

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

    淺析C#封裝GRPC類(lèi)庫(kù)及調(diào)用簡(jiǎn)單實(shí)例

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

最新評(píng)論

洛阳市| 海阳市| 荔波县| 德钦县| 武陟县| 内丘县| 始兴县| 红河县| 襄汾县| 金坛市| 济源市| 淄博市| 信宜市| 邛崃市| 从化市| 恩施市| 嘉黎县| 长白| 曲麻莱县| 巴林右旗| 灌南县| 库尔勒市| 武安市| 石渠县| 临沭县| 八宿县| 全南县| 米易县| 图木舒克市| 恩平市| 会东县| 本溪| 淮北市| 桑日县| 西乌珠穆沁旗| 湾仔区| 临西县| 马公市| 南江县| 那曲县| 华宁县|