C# NPOI 操作

protected override void Export_Click(object sender, EventArgs e)
{
    if (templeId == 0)
        if (!string.IsNullOrEmpty(Request.QueryString["TempleID"]))
            int.TryParse(Request.QueryString["TempleID"], out templeId);
    if (templeId == 0)
    {
        AlertLabel.Text = MessagePage.GetDivCueMsg(MsgCueDiv.UnSuccess, "No data.");
        return;
    }
    var templeInfo = new EMS_ContainerTemplate().GetModel(templeId);
    var dt = new EMS_ContainerDetailTemplate().GetListById(templeId);
    List<int> ColumnsWidth = new List<int>() { 14, templeInfo.ContainerTemplateName.Length, 0, 0 };
    IWorkbook workbook = new HSSFWorkbook();
    ISheet sheet = workbook.CreateSheet("sheet");
    IRow row0 = sheet.CreateRow(0);
    row0.CreateCell(0).SetCellValue("Template Name:");
    row0.CreateCell(1).SetCellValue(templeInfo.ContainerTemplateName);

    Dictionary<string, string> dicColumns = new Dictionary<string, string>();
    dicColumns.Add("ItemCode", "Item ID");
    dicColumns.Add("ItemName", "Item Name");
    dicColumns.Add("DefaultUnit", "Basic Unit");
    dicColumns.Add("Qty", "Planned Qty");

    IRow row2 = sheet.CreateRow(1);
    int index = 0;

    Action<string> act = b =>
    {
        if (!string.IsNullOrEmpty(b))
        {
            if (index < ColumnsWidth.Count)
            {
                if (b.Length > ColumnsWidth[index])
                {
                    ColumnsWidth[index] = b.Length;
                }
            }
            else
            {
                ColumnsWidth.Add(b.Length);
            }
        }
    };

    foreach (var item in dicColumns)
    {
        act(item.Value);
        row2.CreateCell(index).SetCellValue(item.Value);
        index++;
    }
    sheet.CreateRow(2);
    for (int i = 3; i < dt.Rows.Count + 3; i++)
    {
        IRow row = sheet.CreateRow(i);
        index = 0;
        foreach (var item in dicColumns)
        {
            string cellString = DataConvert.ToString(dt.Rows[i - 3][item.Key]);

            act(cellString);

            row.CreateCell(index).SetCellValue(cellString);
            index++;
        }
    }

    //set columns width
    for (int i = 0; i < ColumnsWidth.Count; i++)
    {
        sheet.SetColumnWidth(i, ColumnsWidth[i] * 256);
    }

    //write to steam
    MemoryStream stream = new MemoryStream();
    workbook.Write(stream);
    var buf = stream.ToArray();


    //epport
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode($"PackingTemplate_{ReplaceFile(templeInfo.ContainerTemplateName)}.xls", System.Text.Encoding.UTF8));
    HttpContext.Current.Response.BinaryWrite(buf);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
}

### C# 使用 NPOI 操作 Excel 模板文件 当使用 C#NPOI 库来操作 Excel 模板文件时,主要步骤涉及加载现有的模板文件、修改其中的内容并保存更改后的文档。下面是一个详细的示例说明如何实现这一过程。 #### 加载现有模板文件 为了读取已有的 `.xlsx` 或者 `.xls` 文件作为模板,可以通过 `FileStream` 打开该文件,并创建相应的 Workbook 对象: ```csharp using (var fs = new FileStream(templatePath, FileMode.Open, FileAccess.Read)) { IWorkbook templateWorkbook; if (templatePath.EndsWith(".xlsx")) templateWorkbook = new XSSFWorkbook(fs); else templateWorkbook = new HSSFWorkbook(fs); // 继续后续的操作... } ``` 此处判断了文件扩展名以决定实例化哪种型的 WorkBook 型对象[^1]。 #### 修改模板中的数据 一旦获得了工作簿对象之后就可以访问其内部的工作表以及单元格来进行编辑。假设要向第一个 sheet 的 A1 单元格写入新值,则可按如下方式执行: ```csharp ISheet sheet = templateWorkbook.GetSheetAt(0); // 获取第一页 IRow row = sheet.GetRow(0) ?? sheet.CreateRow(0); // 如果不存在则新建一行 ICell cell = row.GetCell(0) ?? row.CreateCell(0); // 同样地获取或创建指定位置的cell cell.SetCellValue("新的内容"); // 设置新的字符串值给这个cell ``` 这段代码展示了怎样定位到特定的位置并对之赋值[^2]。 #### 将更新后的内容写出至响应流或其他存储介质 完成所有的变更以后,需要把最终的结果输出成一个新的 Excel 文件或者直接返回给客户端浏览器下载。这里展示了一个简单的例子用于通过 ASP.NET Core 控制器方法发送文件给用户端: ```csharp public IActionResult ExportFromTemplate() { string templateFilePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "templates", "example_template.xlsx"); using var stream = System.IO.File.OpenRead(templateFilePath); using var workbookStream = new MemoryStream(); { IWorkbook wb; try { wb = new XSSFWorkbook(stream); ISheet sheet = wb.GetSheetAt(0); IRow row = sheet.GetRow(0) ?? sheet.CreateRow(0); ICell cell = row.GetCell(0) ?? row.CreateRow(0).CreateCell(0); cell.SetCellValue(DateTime.Now.ToString()); wb.Write(workbookStream); } finally { stream.Close(); } byte[] byteArray = workbookStream.ToArray(); return File(byteArray, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"exported_{DateTime.Now:yyyyMMddHHmmss}.xlsx"); } } ``` 此段代码实现了从服务器上的某个路径加载模板文件,在内存中对其进行必要的调整后再将其转换为字节数组形式供 HTTP 响应体传输[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值