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

