C#代碼實(shí)現(xiàn)從PDF中提取表格并另存為Excel文件
將 PDF 中的表格提取并轉(zhuǎn)換為 Excel 格式具有諸多優(yōu)勢(shì),例如可以在更靈活、更加熟悉的環(huán)境中對(duì)數(shù)據(jù)進(jìn)行編輯、分析和可視化處理。這對(duì)于需要處理大量表格數(shù)據(jù)的研究人員、數(shù)據(jù)分析師以及各類(lèi)專(zhuān)業(yè)人士來(lái)說(shuō)尤為重要。
本文將介紹如何使用 Spire.Office for .NET,通過(guò) C# 和 VB.NET 將 PDF 中的表格提取并導(dǎo)出為 Excel 文件。
安裝 Spire.Office for .NET
首先,需要在 .NET 項(xiàng)目中引用 Spire.Office for .NET 包中的 Spire.Pdf.dll 和 Spire.Xls.dll。
其中:
- Spire.PDF 用于從 PDF 表格中提取數(shù)據(jù);
- Spire.XLS 用于根據(jù)提取到的數(shù)據(jù)生成 Excel 文檔。
你可以通過(guò)官網(wǎng)下載對(duì)應(yīng)的 DLL 文件后手動(dòng)添加引用,也可以直接通過(guò) NuGet 進(jìn)行安裝,更加便捷高效。
PM> Install-Package Spire.Office
在 C#、VB.NET 中提取 PDF 文件中的表格并另存為Excel文件
Spire.PDF for .NET 提供了 PdfTableExtractor.ExtractTable(int pageIndex) 方法,用于從可搜索的 PDF 指定頁(yè)面中提取表格。
通過(guò) PdfTable.GetText(int rowIndex, int columnIndex) 方法,可以獲取表格中指定單元格的文本內(nèi)容。隨后,借助 Spire.XLS for .NET 提供的 Worksheet.Range[row, column].Value 屬性,即可將這些數(shù)據(jù)寫(xiě)入 Excel 工作表。
具體操作步驟如下:
- 創(chuàng)建
PdfDocument類(lèi)的實(shí)例。 - 使用
PdfDocument.LoadFromFile()方法加載示例 PDF 文件。 - 調(diào)用
PdfTableExtractor.ExtractTable()方法,從指定頁(yè)面提取表格。 - 使用
PdfTable.GetText()方法獲取表格中指定單元格的文本內(nèi)容。 - 創(chuàng)建
Workbook對(duì)象。 - 通過(guò)
Worksheet.Range.Value屬性,將從 PDF 獲取的單元格數(shù)據(jù)寫(xiě)入工作表。 - 使用
Workbook.SaveToFile()方法,將工作簿保存為 Excel 文件。
下面的代碼示例演示了如何提取 PDF 文檔中的所有表格,并將每個(gè)表格分別寫(xiě)入同一個(gè)工作簿中的獨(dú)立工作表。
示例代碼:
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;
namespace ExtractTablesToExcel
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 PdfDocument 對(duì)象
PdfDocument doc = new PdfDocument();
// 加載示例 PDF 文件
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\table.pdf");
// 創(chuàng)建 Workbook 對(duì)象
Workbook workbook = new Workbook();
// 清除默認(rèn)的工作表
workbook.Worksheets.Clear();
// 初始化 PdfTableExtractor 類(lèi)的實(shí)例
PdfTableExtractor extractor = new PdfTableExtractor(doc);
// 聲明 PdfTable 數(shù)組
PdfTable[] tableList = null;
int sheetNumber = 1;
// 遍歷 PDF 的每一頁(yè)
for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
{
// 從指定頁(yè)面提取表格
tableList = extractor.ExtractTable(pageIndex);
// 判斷表格列表是否為空
if (tableList != null && tableList.Length > 0)
{
// 遍歷當(dāng)前頁(yè)面中的每一個(gè)表格
foreach (PdfTable table in tableList)
{
// 添加一個(gè)新的工作表
Worksheet sheet = workbook.Worksheets.Add(
String.Format("sheet{0}", sheetNumber)
);
// 獲取當(dāng)前表格的行數(shù)和列數(shù)
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 遍歷表格的行和列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// 獲取指定單元格的文本內(nèi)容
string text = table.GetText(i, j);
// 將文本寫(xiě)入 Excel 指定單元格
sheet.Range[i + 1, j + 1].Value = text;
}
}
sheetNumber++;
}
}
}
// 保存為 Excel 文件
workbook.SaveToFile("ToExcel.xlsx", ExcelVersion.Version2013);
}
}
}方法補(bǔ)充
C#提取PDF文件中的表格并轉(zhuǎn)換為Excel和CSV表格
完整代碼示例:
using System.Text;
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;
namespace ExtractTablesToExcel
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建 PdfDocument 對(duì)象并加載示例PDF文件
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("示例.pdf");
// 創(chuàng)建 Workbook 對(duì)象并清除默認(rèn)工作表
Workbook workbook = new Workbook();
workbook.Worksheets.Clear();
// 初始化 PdfTableExtractor 類(lèi)的實(shí)例
PdfTableExtractor extractor = new PdfTableExtractor(doc);
// 聲明 PdfTable 數(shù)組
PdfTable[]? tableList = null;
int sheetNumber = 1;
// 循環(huán)遍歷頁(yè)面
for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
{
// 從特定頁(yè)面提取表格
tableList = extractor.ExtractTable(pageIndex);
// 判斷表格列表是否為空
if (tableList != null && tableList.Length > 0)
{
// 遍歷列表中的表格
foreach (PdfTable table in tableList)
{
// 添加工作表
Worksheet sheet = workbook.Worksheets.Add(string.Format("Table_{0}", sheetNumber));
// 獲取特定表格的行數(shù)和列數(shù)
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循環(huán)遍歷行和列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// 從特定單元格獲取文本
string text = table.GetText(i, j);
// 將文本寫(xiě)入指定單元格
sheet.Range[i + 1, j + 1].Value = text;
}
}
sheet.SaveToFile("output/表格/CSV表格.csv", ",", Encoding.UTF8);
sheetNumber++;
}
}
}
// 保存為Excel工作簿
workbook.SaveToFile("output/表格/Excel表格.xlsx", ExcelVersion.Version2013);
doc.Close();
workbook.Dispose();
}
}
}
C# 提取 PDF 中的表格
如果你需要快速預(yù)覽表格數(shù)據(jù)(例如,開(kāi)發(fā)調(diào)試或驗(yàn)證提取結(jié)果),可以直接通過(guò)控制臺(tái)實(shí)時(shí)輸出結(jié)果,無(wú)需生成額外文件,節(jié)省開(kāi)發(fā)時(shí)間。
從 PDF 表格中提取數(shù)據(jù)的關(guān)鍵方法:
- PdfDocument:表示一個(gè) PDF 文件。
- LoadFromFile:加載要處理的 PDF 文件。
- PdfTableExtractor:基于視覺(jué)線索檢測(cè) PDF 中的表格。
- ExtractTable(pageIndex):提取指定頁(yè)碼的所有表格,返回 PdfTable 數(shù)組。
- GetRowCount()/GetColumnCount():檢索每個(gè)表格的行數(shù)和列數(shù)。
- GetText(rowIndex, columnIndex):從指定單元格中提取文本。
using Spire.Pdf;
using Spire.Pdf.Utilities;
namespace ExtractPdfTable
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建PdfDocument對(duì)象
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.LoadFromFile("表格.pdf");
// 初始化PdfTableExtractor類(lèi)的實(shí)例
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 循環(huán)遍歷頁(yè)面
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 從特定頁(yè)面提取表格
PdfTable[] tableList = extractor.ExtractTable(pageIndex);
// 判斷表格列表是否為空
if (tableList != null && tableList.Length > 0)
{
int tableNumber = 1;
// 循環(huán)遍歷列表中的表格
foreach (PdfTable table in tableList)
{
Console.WriteLine($"\n第 {pageIndex + 1} 頁(yè)的第 {tableNumber} 個(gè)表格:");
Console.WriteLine("-----------------------------------");
// 獲取特定表格的行數(shù)和列數(shù)
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循環(huán)遍歷行和列
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
// 從特定單元格獲取文本
string text = table.GetText(i, j);
// 將單元格文本打印到控制臺(tái)并帶有分隔符
Console.Write($"{text}\t");
}
// 每行后換行
Console.WriteLine();
}
tableNumber++;
}
}
}
// 關(guān)閉文檔
pdf.Close();
}
}
}
C# 將 PDF 表格導(dǎo)出為 CSV
CSV(逗號(hào)分隔值)是表格數(shù)據(jù)的行業(yè)標(biāo)準(zhǔn),與 Excel、Google Sheets 和數(shù)據(jù)庫(kù)兼容。此方法通過(guò)引用單元格和處理特殊字符,將提取的表格格式化為有效的 CSV 文件。
提取 PDF 表格到 CSV 的主要特點(diǎn):
- StreamWriter:增量寫(xiě)入數(shù)據(jù)到 CSV 文件,減少大型 PDF 文件的內(nèi)存占用。
- 特殊字符處理:按 CSV 標(biāo)準(zhǔn)轉(zhuǎn)義單元格中的逗號(hào)和雙引號(hào),避免列錯(cuò)位。
- 工具兼容:生成的 CSV 可直接用 Excel 打開(kāi),無(wú)需手動(dòng)調(diào)整格式,減少后續(xù)操作成本。
- 編碼兼容:UTF-8 編碼確保中文、特殊符號(hào)在 Excel 中正常顯示(避免打開(kāi)時(shí)亂碼)。
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;
namespace ExtractTableToCsv
{
class Program
{
static void Main(string[] args)
{
// 創(chuàng)建PdfDocument對(duì)象
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.LoadFromFile("表格.pdf");
// 創(chuàng)建StreamWriter對(duì)象以高效寫(xiě)入CSV
using (StreamWriter csvWriter = new StreamWriter("PDF表格.csv", false, Encoding.UTF8))
{
// 創(chuàng)建PdfTableExtractor對(duì)象
PdfTableExtractor extractor = new PdfTableExtractor(pdf);
// 循環(huán)遍歷頁(yè)面
for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
{
// 從特定頁(yè)面提取表格
PdfTable[] tableList = extractor.ExtractTable(pageIndex);
// 判斷表格列表是否為空
if (tableList != null && tableList.Length > 0)
{
// 循環(huán)遍歷列表中的表格
foreach (PdfTable table in tableList)
{
// 獲取特定表格的行數(shù)和列數(shù)
int row = table.GetRowCount();
int column = table.GetColumnCount();
// 循環(huán)遍歷行
for (int i = 0; i < row; i++)
{
// 創(chuàng)建列表存儲(chǔ)數(shù)據(jù)
List<string> rowData = new List<string>();
// 循環(huán)遍歷列
for (int j = 0; j < column; j++)
{
// 從表格單元格檢索文本
string cellText = table.GetText(i, j).Replace("\"", "\"\"");
// 將單元格文本添加到列表并用雙引號(hào)括起來(lái)
rowData.Add($"\"{cellText}\"");
}
// 用逗號(hào)連接單元格并寫(xiě)入CSV
csvWriter.WriteLine(string.Join(",", rowData));
}
}
}
}
}
}
}
}
到此這篇關(guān)于C#代碼實(shí)現(xiàn)從PDF中提取表格并另存為Excel文件的文章就介紹到這了,更多相關(guān)C#提取PDF表格并存為Excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#實(shí)現(xiàn)高保真的Excel轉(zhuǎn)PDF詳解(無(wú)需 Office 環(huán)境)
- C#使用Spire.XLS將Excel工作簿轉(zhuǎn)換為PDF的實(shí)現(xiàn)步驟
- C#如何將Excel轉(zhuǎn)換為PDF
- C#實(shí)現(xiàn)將PDF轉(zhuǎn)為Excel的方法詳解
- C#實(shí)現(xiàn)Excel轉(zhuǎn)PDF時(shí)設(shè)置內(nèi)容適應(yīng)頁(yè)面寬度
- C#?將Excel轉(zhuǎn)為PDF時(shí)自定義表格紙張大小的代碼思路
- C#將Excel轉(zhuǎn)成PDF的方法
相關(guān)文章
使用Spire.Barcode程序庫(kù)生成二維碼的實(shí)例解析
這篇文章主要介紹了使用Spire.Barcode程序庫(kù)生成二維碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
C#實(shí)現(xiàn)人民幣大寫(xiě)轉(zhuǎn)換示例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)人民幣大寫(xiě)轉(zhuǎn)換,需要的朋友可以參考使用2013-12-12
C#中WebBrowser.DocumentCompleted事件多次調(diào)用問(wèn)題解決方法
這篇文章主要介紹了C#中WebBrowser.DocumentCompleted事件多次調(diào)用問(wèn)題解決方法,本文講解了3種情況和各自情況的解決方法,需要的朋友可以參考下2015-01-01
c# String擴(kuò)展 讓你在PadLeft和PadRight時(shí)不再受單雙字節(jié)問(wèn)題困擾
這篇文章主要介紹了c# String擴(kuò)展 讓你在PadLeft和PadRight時(shí)不再受單雙字節(jié)問(wèn)題困擾,需要的朋友可以參考下2020-04-04

