You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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("导出完成!");
        }
    }
}

关键注意点

  1. 确保你用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);
  1. 如果你用方案一,记得在程序退出时释放Excel COM对象,避免内存泄漏(可以用Marshal.ReleaseComObject)。

内容的提问来源于stack exchange,提问作者w.c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:46