当前位置: 代码网 > it编程>编程语言>Asp.net > C#使用NPOI实现将表格中数据导入Excel

C#使用NPOI实现将表格中数据导入Excel

2025年02月18日 Asp.net 我要评论
在c#中,使用npoi库将表格数据导入excel的操作相对直接。npoi是.net版本的poi,可以帮助我们在没有安装microsoft office的情况下读写office文件,如xls和xlsx。

在c#中,使用npoi库将表格数据导入excel的操作相对直接。npoi是.net版本的poi,可以帮助我们在没有安装microsoft office的情况下读写office文件,如xls和xlsx。以下是使用npoi将datatable导出到excel的基本步骤:

创建工作簿:首先,你需要创建一个iworkbook对象,这是excel文件的开始。

创建工作表:使用workbook.createsheet("sheet1")创建一个新的工作表。

创建表头:通过遍历datatable的列来创建excel文件的表头。

填充数据:遍历datatable的每一行,并为每个单元格填充数据。

写入文件:最后,将工作簿写入到文件流中,保存为excel文件。

下面是一个简单的示例代码,展示了如何将datatable导出到excel文件:

using npoi.xssf.usermodel; // 用于处理xlsx文件
using npoi.hssf.usermodel; // 用于处理xls文件
using system.data;
using system.io;
 
public void exporttoexcel(datatable dt, string filepath)
{
    iworkbook workbook;
    // 根据文件扩展名选择工作簿类型
    if (path.getextension(filepath).equals(".xlsx", stringcomparison.ordinalignorecase))
    {
        workbook = new xssfworkbook();
    }
    else
    {
        workbook = new hssfworkbook();
    }
 
    isheet sheet = workbook.createsheet("sheet1");
 
    // 创建表头
    irow headerrow = sheet.createrow(0);
    for (int i = 0; i < dt.columns.count; i++)
    {
        headerrow.createcell(i).setcellvalue(dt.columns[i].columnname);
    }
 
    // 填充数据
    for (int i = 0; i < dt.rows.count; i++)
    {
        irow row = sheet.createrow(i + 1);
        for (int j = 0; j < dt.columns.count; j++)
        {
            row.createcell(j).setcellvalue(dt.rows[i][j].tostring());
        }
    }
 
    // 写入文件
    using (filestream filestream = new filestream(filepath, filemode.create, fileaccess.write))
    {
        workbook.write(filestream);
    }
}

在上述代码中,我们首先检查文件扩展名来决定创建xssfworkbook(用于.xlsx文件)还是hssfworkbook(用于.xls文件)。然后,我们创建一个工作表,并填充表头和数据。最后,我们将工作簿写入到指定的文件路径。

实际中第一步

 private void btnderive_click(object sender, eventargs e)
 {
     savefiledialog savefiledialog = new savefiledialog();
     savefiledialog.filter = "excel files (*.xlsx)|*.xlsx";
     savefiledialog.title = "选择导出文件保存位置";
     savefiledialog.filename = getfilename();
 
     if (savefiledialog.showdialog() == dialogresult.ok)
     {
         export(datagridview1, savefiledialog.filename);
     }
 }
  private string getfilename()
  {
      return $"产品类型表_{datetime.now:yyyymmddhhmmss}.xlsx";
  }
 private void export(datagridview dgv, string filename)
 {
     try
     {
         iworkbook wb = new xssfworkbook();
         //npoi 使用hssfworkbook 类来处理 xls,xssfworkbook 类来处理 xlsx。
         //它们都继承接口 iworkbook,通过 iworkbook 来统一处理 xls 和 xlsx 格式的文件
         isheet sheet = wb.createsheet();
         irow row;
         //获取datagridview的列名,其中 i 表示低级列,i从0开始
         row = sheet.createrow(0);
         // 生成标题,注意第一列是“操作”列,不处理
         for (int k = 1; k < dgv.columns.count; k++)
         {
             row.createcell(k - 1).setcellvalue(dgv.columns[k].headertext.tostring());
         }
         for (int i = 0; i < dgv.rows.count; i++)
         {
             row = sheet.createrow(i + 1);
             for (int k = 1; k < dgv.columns.count; k++)
             {
                 string value = dgv.rows[i].cells[k].value == null ? "" : dgv.rows[i].cells[k].value.tostring();
                 row.createcell(k - 1).setcellvalue(value);
             }
         }
         using (var fs = new filestream(filename, filemode.openorcreate, fileaccess.readwrite))
         {
             wb.write(fs); //写入到excel中
         }
         messagebox.show("保存成功,文件名:" + filename, "提示", messageboxbuttons.ok, messageboxicon.information);
     }
     catch (exception ex)
     {
         messagebox.show(ex.message, "错误", messageboxbuttons.ok, messageboxicon.error);
     }
 }

c# 使用npoi将datatable 写入excel 中的数据类型转换

方法一

using system;
using system.data;
using npoi.ss.usermodel;
using npoi.xssf.usermodel;
 
public class excelwriter
{
    public static void writedatatabletoexcel(datatable datatable, string filepath)
    {
        // 创建一个新的工作簿
        iworkbook workbook = new xssfworkbook();
        // 创建一个工作表
        isheet sheet = workbook.createsheet("sheet1");
 
        // 创建标题行
        irow headerrow = sheet.createrow(0);
        for (int i = 0; i < datatable.columns.count; i++)
        {
            headerrow.createcell(i).setcellvalue(datatable.columns[i].columnname);
        }
 
        // 填充数据行
        int rowindex = 1;
        foreach (datarow row in datatable.rows)
        {
            irow datarow = sheet.createrow(rowindex++);
            for (int i = 0; i < datatable.columns.count; i++)
            {
                datacolumn column = datatable.columns[i];
                icell cell = datarow.createcell(i);
 
                switch (column.datatype.name.tolower())
                {
                    case "string":
                        cell.setcellvalue(row[i].tostring());
                        break;
                    case "int32":
                    case "int64":
                        cell.setcellvalue(convert.toint32(row[i]));
                        break;
                    case "double":
                        cell.setcellvalue(convert.todouble(row[i]));
                        break;
                    case "datetime":
                        cell.setcellvalue(convert.todatetime(row[i]));
                        break;
                    case "boolean":
                        cell.setcellvalue(convert.toboolean(row[i]));
                        break;
                    default:
                        cell.setcellvalue(row[i].tostring());
                        break;
                }
            }
        }
 
        // 将工作簿写入文件
        using (var fs = new filestream(filepath, filemode.create, fileaccess.write))
        {
            workbook.write(fs);
        }
    }
}

方法二

public static void createsheet(iworkbook workbook, datatable dt, int num)
{
    isheet sheet = string.isnullorempty(dt.tablename) ? workbook.createsheet("sheet" + num) : workbook.createsheet(dt.tablename);
 
    icellstyle style = workbook.createcellstyle();//设置表格样式
    style.borderbottom = borderstyle.thin;//下边框线(给表格加入背景颜色后,就会覆盖原来的边框,直接设置边框样式可以解决这一问题)
    style.borderleft = borderstyle.thin; //左边框线
    style.borderright = borderstyle.thin;//右边框线
    style.bordertop = borderstyle.thin;//上边框线
 
    sheet.printsetup.papersize = 9;//a4纸张打印
    sheet.printsetup.landscape = true;//横向打印(默认为false即竖向)
 
    //设置自动调整为一页宽度
    sheet.autobreaks = false;//必须设置
    sheet.fittopage = true; //一页宽   
    sheet.printsetup.fitwidth = 1;
    sheet.printsetup.fitheight = short.maxvalue;
 
    //表头  
    irow row = sheet.createrow(0);
    for (int i = 0; i < dt.columns.count; i++)
    {
        icell cell = row.createcell(i);
        cell.setcellvalue(dt.columns[i].columnname);
        cell.cellstyle = style;
    }
 
    //数据  
    for (int i = 0; i < dt.rows.count; i++)
    {
        irow row1 = sheet.createrow(i + 1);
        for (int j = 0; j < dt.columns.count; j++)
        {
            icell cell = row1.createcell(j);
            cell.cellstyle = style;
 
            if (dt.columns[j].datatype.equals(typeof(bool)) && bool.tryparse(dt.rows[i][j].tostring(), out bool b))
            {
                cell.setcellvalue(b);
            }
            else if (double.tryparse(dt.rows[i][j].tostring(), out double d))//数字格式
            {
                cell.setcellvalue(d);
            }
            else
            {
                cell.setcellvalue(dt.rows[i][j].tostring());
            }
        }
    }
 
    for (int columnindex = 0; columnindex < dt.rows.count; columnindex++)
    {
        sheet.autosizecolumn(columnindex); //列宽自适应
    }
 
}

到此这篇关于c#使用npoi实现将表格中数据导入excel的文章就介绍到这了,更多相关c# npoi数据导入excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • C# 类库打包dll文件的操作流程

    前言在c#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将c# cs类文件加密为dll文件的方式进行保护。操作流程在 visual studio…

    2025年03月05日 编程语言
  • C#实现一个相当全面的数据转换工具类

    C#实现一个相当全面的数据转换工具类

    c#通用工具类dataconvert,作为静态类全局可调用,来进行数据转换。包括byte[]转数字、csv、数字转byte[]、16进制数转换、tryparse... [阅读全文]
  • 基于C#实现语音合成播报器

    基于C#实现语音合成播报器

    一、语音合成播报应用场景语音合成播报器广泛应用于以下领域:工业控制:生产线异常报警、设备状态实时播报(如网页4中的wincc语音报警插件)智能服务:医院叫号系统... [阅读全文]
  • C# winform操作CSV格式文件

    C# winform操作CSV格式文件

    实例一实例效果当在winform界面中点击读取按钮时 将csv中的所有数据读取出来放置在datagridview控件,可以在datagridview控件中编辑数... [阅读全文]
  • C#加锁防止并发的几种方法详解

    前言在最近的工作中,有一个抽奖的需求。涉及到利益发放,这时候就需要加锁,防止权益的重复发放,避免对客户造成经济损失。在实际的工作中我用到的是redis分布式锁,借此机会我学习一下c…

    2025年03月06日 编程语言
  • 最新版Anaconda安装教程

    安装新的anaconda需要卸载干净上一个版本的anaconda,不然可能会在新版本安装过程或者后续使用过程中出错,完全卸载干净anaconda的方法,可以参考这篇文章!第一步:下…

    2025年03月07日 编程语言

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com