如何将Zen Barcode框架生成的条码及QR码插入Excel?
我来帮你搞定这个条码导出到Excel的问题!你目前只能存成JPEG再处理,核心原因是没直接利用PictureBox里的内存图像对象插入Excel,而是走了本地文件的弯路。下面给你两种可行的实现方案:
方案一:依赖Office互操作(适合已安装Microsoft Office的环境)
这个方案用官方的Office互操作库,直接把PictureBox中的图像导入Excel,不需要先存文件。
步骤1:添加必要引用
- 右键项目 → 管理NuGet程序包,搜索并安装
Microsoft.Office.Interop.Excel - 确保项目引用了
System.Windows.Forms(AxHost类需要这个)
步骤2:实现导出代码
把下面的代码放到你的「转换为Excel」按钮点击事件里:
private void btnExportToExcel_Click(object sender, EventArgs e) { try { // 先检查条码是否已生成 if (pictureBoxBarcode.Image == null) { MessageBox.Show("请先生成条码或QR码再导出!"); return; } // 初始化Excel应用 var excelApp = new Microsoft.Office.Interop.Excel.Application(); excelApp.Visible = true; // 让Excel窗口显示出来 var workbook = excelApp.Workbooks.Add(); var worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.ActiveSheet; // 导出文本框内容(这里替换成你自己的文本导出逻辑即可) worksheet.Cells[1, 1].Value = "条码内容:"; worksheet.Cells[1, 2].Value = txtBarcodeInput.Text; worksheet.Range["A1:B1"].Font.Bold = true; // 把PictureBox的Image转换成Excel能识别的IPictureDisp对象 var excelPicture = ImageToExcelPicture(pictureBoxBarcode.Image); // 插入图像到指定单元格(比如A2位置) var targetCell = worksheet.Range["A2"]; var barcodeShape = worksheet.Shapes.AddPicture( excelPicture, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoTrue, targetCell.Left, targetCell.Top, pictureBoxBarcode.Image.Width, pictureBoxBarcode.Image.Height ); // 可选:调整图像大小和比例,适配单元格 barcodeShape.LockAspectRatio = Microsoft.Office.Core.MsoTriState.msoTrue; barcodeShape.Height = 120; // 固定高度,自动按比例调整宽度 MessageBox.Show("导出成功!"); } catch (Exception ex) { MessageBox.Show($"导出出错:{ex.Message}"); } } // 辅助方法:将WinForms Image转换为Excel兼容的IPictureDisp private object ImageToExcelPicture(Image image) { return System.Windows.Forms.AxHost.GetIPictureFromPicture(image); }
方案二:使用EPPlus(无需安装Office,轻量化)
如果你不想依赖本地Office安装,推荐用开源的EPPlus库,它直接操作Excel文件,不需要Office环境。
步骤1:添加EPPlus引用
- 在NuGet中搜索安装
EPPlus(注意非商用需设置LicenseContext)
步骤2:实现导出代码
using OfficeOpenXml; using System.IO; private void btnExportToExcel_Click(object sender, EventArgs e) { if (pictureBoxBarcode.Image == null) { MessageBox.Show("请先生成条码或QR码!"); return; } // 设置EPPlus的非商用授权(商用需购买授权) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var excelPackage = new ExcelPackage()) { // 创建工作表 var worksheet = excelPackage.Workbook.Worksheets.Add("条码导出"); // 导出文本内容 worksheet.Cells[1, 1].Value = "条码内容:"; worksheet.Cells[1, 2].Value = txtBarcodeInput.Text; worksheet.Cells[1, 1, 1, 2].Style.Font.Bold = true; // 把图像转成内存流,插入到Excel using (var imageStream = new MemoryStream()) { pictureBoxBarcode.Image.Save(imageStream, System.Drawing.Imaging.ImageFormat.Png); imageStream.Position = 0; // 插入图像到A2单元格位置 var barcodeImage = worksheet.Drawings.AddPicture("BarcodeImage", imageStream); barcodeImage.SetPosition(1, 0, 0, 0); // 第2行(索引1)、第1列(索引0) barcodeImage.SetSize(300, 100); // 设置图像大小 } // 保存Excel文件 var saveDialog = new SaveFileDialog(); saveDialog.Filter = "Excel文件 (*.xlsx)|*.xlsx"; if (saveDialog.ShowDialog() == DialogResult.OK) { excelPackage.SaveAs(new FileInfo(saveDialog.FileName)); MessageBox.Show("导出完成!"); } } }
关键注意点
- 确保你用Zen Barcode生成条码后,已经把图像赋值给了
pictureBoxBarcode.Image,比如:
// 示例Zen Barcode生成代码(ZXing.Net) var writer = new ZXing.BarcodeWriterPixelData { Format = ZXing.BarcodeFormat.CODE_128, Options = new ZXing.Common.EncodingOptions { Height = 100, Width = 300 } }; var pixelData = writer.Write(txtBarcodeInput.Text); pictureBoxBarcode.Image = Image.FromPixelData(pixelData);
- 如果你用方案一,记得在程序退出时释放Excel COM对象,避免内存泄漏(可以用
Marshal.ReleaseComObject)。
内容的提问来源于stack exchange,提问作者w.c
相关产品推荐
相关产品推荐

