Skip to content

在Blazor中使用MiniExcel处理条码

About 723 wordsAbout 2 min

BlazorMiniExcel条码处理数据处理

2024-05-14

简介

在实验室信息系统中,我们经常需要处理包含条码信息的Excel文件。本文将介绍如何使用MiniExcel在Blazor应用中高效处理条码数据。

实现步骤

1. 添加NuGet包引用

首先,在项目文件中添加MiniExcel包引用:

<PackageReference Include="MiniExcel" Version="1.39.0" />

2. 创建条码处理组件

@page "/qc/convertid"
@using MiniExcelLibs
@inject IBarcodeEncryption BarcodeEncryption

<div class="mb-3 gap-2">
    加密
    <InputFile OnChange="@LoadFile" class="form-control" accept=".xlsx,.xls"/>
</div>

@code {
    private async Task LoadFile(InputFileChangeEventArgs e)
    {
        var file = e.File;
        if (file == null) return;

        try
        {
            var stream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(stream);
            stream.Position = 0;

            // 读取Excel数据
            var rows = await stream.QueryAsync();
            var dataList = rows.ToList();

            // 获取表头
            var headers = ((IDictionary<string, object>)dataList[0]).Keys.ToList();

            // 查找条码列
            var barcodeColName = headers.FirstOrDefault(h => 
                h.Contains("条码号", StringComparison.OrdinalIgnoreCase));

            if (string.IsNullOrEmpty(barcodeColName))
            {
                await MessageService.Error("未找到条码列");
                return;
            }

            // 处理每一行的条码
            foreach (IDictionary<string, object> row in dataList)
            {
                var barcode = row[barcodeColName]?.ToString();
                if (!string.IsNullOrEmpty(barcode))
                {
                    var encryptedBarcode = await BarcodeEncryption.EncryptAsync(barcode);
                    row[barcodeColName] = encryptedBarcode;
                }
            }

            // 保存处理后的文件
            var outputStream = new MemoryStream();
            await outputStream.SaveAsAsync(dataList);

            // 触发下载
            await JS.InvokeVoidAsync("downloadFileFromStream", 
                new DotNetStreamReference(outputStream), 
                "processed_barcodes.xlsx");
        }
        catch (Exception ex)
        {
            await MessageService.Error($"处理失败: {ex.Message}");
        }
    }
}

关键功能说明

  1. 文件上传

    • 使用InputFile组件接收Excel文件
    • 支持.xlsx和.xls格式
    • 异步处理文件上传
  2. 数据读取

    • 使用MiniExcel的QueryAsync方法读取Excel数据
    • 自动识别表头和数据行
    • 支持大数据量处理
  3. 条码处理

    • 自动查找条码列
    • 对每个条码进行加密处理
    • 保持其他列数据不变
  4. 结果输出

    • 生成新的Excel文件
    • 提供文件下载功能
    • 错误处理和用户反馈

性能优化

  1. 内存管理

    • 使用流式处理避免内存溢出
    • 及时释放资源
    • 处理大文件时考虑分批处理
  2. 用户体验

    • 添加进度提示
    • 提供错误反馈
    • 支持取消操作

注意事项

  1. 文件验证

    • 验证文件格式
    • 检查文件大小
    • 确保数据完整性
  2. 错误处理

    • 处理文件读取错误
    • 处理加密失败情况
    • 提供友好的错误提示
  3. 安全性

    • 验证文件来源
    • 限制文件大小
    • 防止恶意文件

总结

通过使用MiniExcel,我们实现了一个高效、可靠的条码处理功能。这个实现具有以下优点:

  1. 代码简洁,易于维护
  2. 性能优秀,内存占用低
  3. 用户体验好,有完整的错误处理
  4. 支持异步操作,不会阻塞UI

后续可以考虑添加更多功能,如:

  • 批量处理多个文件
  • 自定义加密规则
  • 数据预览功能
  • 处理进度显示

作者:Claude

日期:2024-05-14

标签:Blazor, MiniExcel, 条码处理, 数据处理