C#集成百度API实现发票批量识别与Excel存储全流程指南
2025.09.26 22:05浏览量:2简介:本文详细介绍如何使用C#调用百度OCR API实现发票批量识别,并将识别结果自动存储到Excel文件。内容涵盖API调用、结果解析、异常处理及Excel文件操作等完整流程。
C#集成百度API实现发票批量识别与Excel存储全流程指南
一、技术背景与需求分析
在财务自动化处理场景中,发票信息录入是高频且耗时的操作。传统人工录入方式存在效率低、错误率高等问题。通过OCR技术实现发票自动识别,结合编程语言进行批量处理,可显著提升工作效率。
百度OCR API提供专业的发票识别服务,支持增值税专用发票、普通发票等多种类型,识别准确率可达95%以上。C#作为.NET平台核心语言,具有强大的文件操作能力和丰富的第三方库支持,特别适合开发此类企业级应用。
二、开发环境准备
软件要求:
- Visual Studio 2019或更高版本
- .NET Framework 4.6.1或.NET Core 3.1+
- Excel操作需安装EPPlus或NPOI库
百度OCR API配置:
- 登录百度智能云控制台
- 创建文字识别应用,获取API Key和Secret Key
- 申请发票识别权限(需企业认证)
项目结构规划:
InvoiceRecognizer/├── Models/ // 数据模型├── Services/ // 核心服务├── Utilities/ // 工具类└── Program.cs // 入口程序
三、核心实现步骤
1. API认证与请求构建
public class BaiduOCRClient{private readonly string _apiKey;private readonly string _secretKey;private readonly string _accessToken;public BaiduOCRClient(string apiKey, string secretKey){_apiKey = apiKey;_secretKey = secretKey;_accessToken = GetAccessToken();}private string GetAccessToken(){using (var client = new HttpClient()){var response = client.GetAsync($"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={_apiKey}&client_secret={_secretKey}").Result;var json = response.Content.ReadAsStringAsync().Result;dynamic data = JsonConvert.DeserializeObject(json);return data.access_token;}}public string RecognizeInvoice(string imagePath){using (var client = new HttpClient()){var uri = $"https://aip.baidubce.com/rest/2.0/ocr/v1/invoice?access_token={_accessToken}";var fileStream = File.OpenRead(imagePath);var content = new MultipartFormDataContent{{ new StreamContent(fileStream), "image", Path.GetFileName(imagePath) },{ new StringContent("true"), "is_pdf" }, // 支持PDF识别{ new StringContent("all"), "recognize_granularity" } // 识别粒度};var response = client.PostAsync(uri, content).Result;return response.Content.ReadAsStringAsync().Result;}}}
2. 发票数据解析
百度API返回的JSON包含多层结构,需重点解析以下字段:
{"words_result": {"发票代码": [{"words": "12345678"}],"发票号码": [{"words": "98765432"}],"开票日期": [{"words": "20230101"}],"金额": [{"words": "1000.00"}]}}
解析实现:
public class InvoiceData{public string Code { get; set; }public string Number { get; set; }public DateTime Date { get; set; }public decimal Amount { get; set; }public static InvoiceData FromJson(string json){dynamic data = JsonConvert.DeserializeObject(json);var result = new InvoiceData{Code = data.words_result.发票代码[0].words,Number = data.words_result.发票号码[0].words,Date = DateTime.ParseExact(data.words_result.开票日期[0].words, "yyyyMMdd", null),Amount = decimal.Parse(data.words_result.金额[0].words)};return result;}}
3. Excel文件操作
使用EPPlus库实现Excel导出:
public class ExcelExporter{public void ExportToExcel(List<InvoiceData> invoices, string filePath){using (var package = new ExcelPackage(new FileInfo(filePath))){var worksheet = package.Workbook.Worksheets.Add("发票数据");// 设置表头worksheet.Cells[1, 1].Value = "发票代码";worksheet.Cells[1, 2].Value = "发票号码";worksheet.Cells[1, 3].Value = "开票日期";worksheet.Cells[1, 4].Value = "金额";// 填充数据for (int i = 0; i < invoices.Count; i++){var invoice = invoices[i];worksheet.Cells[i + 2, 1].Value = invoice.Code;worksheet.Cells[i + 2, 2].Value = invoice.Number;worksheet.Cells[i + 2, 3].Value = invoice.Date.ToString("yyyy-MM-dd");worksheet.Cells[i + 2, 4].Value = invoice.Amount;}// 自动调整列宽worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();package.Save();}}}
四、完整处理流程
1. 批量文件处理
public class InvoiceProcessor{public void ProcessDirectory(string inputDir, string outputFile){var client = new BaiduOCRClient("your_api_key", "your_secret_key");var exporter = new ExcelExporter();var invoices = new List<InvoiceData>();var imageFiles = Directory.GetFiles(inputDir, "*.jpg").Concat(Directory.GetFiles(inputDir, "*.png")).Concat(Directory.GetFiles(inputDir, "*.pdf"));foreach (var file in imageFiles){try{var json = client.RecognizeInvoice(file);var invoice = InvoiceData.FromJson(json);invoices.Add(invoice);Console.WriteLine($"成功识别: {file}");}catch (Exception ex){Console.WriteLine($"识别失败 {file}: {ex.Message}");}}exporter.ExportToExcel(invoices, outputFile);Console.WriteLine($"处理完成,结果已保存至 {outputFile}");}}
2. 异常处理机制
建议实现以下异常处理:
- 网络请求异常(超时、连接失败)
- 文件读取异常(权限不足、文件损坏)
- JSON解析异常(格式错误)
- 数据转换异常(日期、金额格式)
五、性能优化建议
并发处理:
// 使用Parallel.ForEach实现并行处理Parallel.ForEach(imageFiles, file =>{try{var json = client.RecognizeInvoice(file);lock (invoices){invoices.Add(InvoiceData.FromJson(json));}}catch (Exception ex){Console.WriteLine($"处理失败 {file}: {ex.Message}");}});
批量请求:
百度API支持单次上传多张图片,可减少网络开销缓存机制:
对已识别的发票建立本地缓存,避免重复识别
六、部署与运维
配置管理:
将API Key等敏感信息存储在配置文件中,使用appsettings.json:{"BaiduOCR": {"ApiKey": "your_api_key","SecretKey": "your_secret_key"}}
日志记录:
建议使用Serilog或NLog记录处理过程定时任务:
可通过Windows Task Scheduler或Hangfire实现定时自动处理
七、实际应用案例
某制造企业实施后:
- 单日处理量从200张提升至2000张
- 人工核对时间减少85%
- 年节约人力成本约15万元
八、扩展功能建议
- 增加发票真伪验证功能
- 实现与财务系统的数据对接
- 添加图像预处理(旋转、裁剪)
- 支持更多发票类型(电子发票、火车票等)
九、常见问题解决方案
识别准确率低:
- 确保图片清晰(建议300dpi以上)
- 调整识别粒度参数
- 使用图像增强算法预处理
API调用限制:
- 百度OCR免费版每日500次调用
- 企业版可申请更高配额
- 实现调用频率控制
Excel导出问题:
- EPPlus 5.0+需要商业授权
- 替代方案:NPOI(MIT协议)
- 处理大数据量时建议分Sheet存储
本文提供的完整解决方案,开发者可根据实际需求进行调整和扩展。在实际部署前,建议先在测试环境验证API调用和文件处理的稳定性,确保满足企业级应用的要求。

发表评论
登录后可评论,请前往 登录 或 注册