C#使用NPOI实现Excel导入导出功能
作者:恶势力-从底层码农开始 发布时间:2022-11-01 22:36:19
标签:C#,Excel,导入导出
本文实例为大家分享了C#使用NPOI实现Excel导入导出的具体代码,供大家参考,具体内容如下
Excel导入
使用OpenFileDiolog控件和button结合,选择文件导入,将路径显示在文本框
设置按钮点击事件,将文件路径赋给textBox.Text
private void Department_SUM_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.ShowDialog();
textBox1.Text = open.FileName;
}
实现excel导入,通过textBox1.Text来获取文件路径
private void button_Excel_Click(object sender, EventArgs e)
{
FileStream fs = null;
IWorkbook workbook = null;
ISheet sheet = null;
IRow row = null;
String txtpath = textBox1.Text;
fs = File.OpenRead(txtpath);
workbook = new XSSFWorkbook(fs);
if (workbook != null)
{
sheet = workbook.GetSheetAt(0); //获取excel表格的第一个sheet
if (sheet != null)
{
//行的LastRowNum是0~N-1
//列的LastCellNum是1~N
int rowCount = sheet.LastRowNum;
if (rowCount > 0)
{
IRow firstrow = sheet.GetRow(0);
int cellCount = firstrow.LastCellNum;
for (int i = 0; i <= rowCount - 1; i++)
{
//获取行的第6和第7列数据,如果cell类型是文本,则通过StringCellValue取值
//如果cell类型是数值,则通过NumericCellValue来取值
row = sheet.GetRow(i + 1);
row.Cells[5].NumericCellValue;
row.Cells[6].StringCellValue;
//可以将Cell的数据存放在list中,这里假设将两列cell的数据存入list1,list2
}
fs.Close();
}
//实际存放DataTable的位置
//调用自定义方法,实现导出
Add_DataTable_To_Excel(txtpath, table, sheet_name);
}
}
要实现excel导出,先将程序中的excel存为DataTable格式
本段代码存在于上面代码“//实际存放DataTable的位置”位置
DataTable table = new DataTable();
DataRow dr;
table.Columns.Add("列名1", System.Type.GetType("System.String"));
table.Columns.Add("列名2", System.Type.GetType("System.Double"));
for (int i = 0; i < list4.Count; i++)
{
dr = table.NewRow();
dr["列名1"] = list1i];
dr["列名2"] = list2[i].ToString("0.0000"); //将存入的数据格式保存为保留四位小数
table.Rows.Add(dr);
}
通过方法导出excel,传参为文件路径,DataTable,表名
通过获取要导入数据的目标excel的内容,导入数据,要将excel导出的方式
public bool Add_DataTable_To_Excel(string output_file_path, DataTable dt, string sheet_name)
{
FileStream fs = null;
IWorkbook workbook = null;
ISheet sheet = null;
IRow row = null;
XSSFWorkbook xssfworkbook = null;
fs = new FileStream(output_file_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
xssfworkbook = new XSSFWorkbook(fs);
sheet = xssfworkbook.GetSheet(sheet_name);
//设置马上要使用的Cell数据格式
IDataFormat dataformat = xssfworkbook.CreateDataFormat();
ICellStyle style0 = xssfworkbook.CreateCellStyle();
style0.DataFormat = dataformat.GetFormat("0.0000");
ICellStyle style1 = xssfworkbook.CreateCellStyle();
style1.DataFormat = dataformat.GetFormat("0.00%");
if (sheet != null)
{
int rowCount = sheet.LastRowNum;
if (rowCount > 0)
{
IRow firstrow = sheet.GetRow(0);
int cellCount = firstrow.LastCellNum;
for (int i = 0; i <= rowCount - 1; i++)
{
row = sheet.GetRow(i + 1);
//表中有行为空,将空的行影响消除
if (!"".Equals(row.Cells[code_index].StringCellValue))
{
row = sheet.GetRow(i + 1);
for (int j = 0; j <= dt.Rows.Count - 1; j++)
{
if (row.Cells[code_index].StringCellValue.Equals(dt.Rows[j][0]))
{
//遍历将DataTable中的数据存入Cell的值 row.Cells[1].SetCellValue(Convert.ToDouble(dt.Rows[j][0].ToString()));
row.Cells[1].CellStyle = style0;
row.Cells[2].SetCellValue(Convert.ToDouble(dt.Rows[j][1].ToString()) / Convert.ToDouble(dt.Rows[j][1].ToString()));
row.Cells[2].CellStyle = style1;
}
}
}
}
}
}
//导出excel
MemoryStream stream = new MemoryStream();
xssfworkbook.Write(stream);
var buf = stream.ToArray();
using (FileStream fss = new FileStream(txtpath, FileMode.Create, FileAccess.Write)) //保存为Excel文件
{
fss.Write(buf, 0, buf.Length);
fss.Flush();
}
return true;
}
基础的Excel文件的导入导出功能到这里全部完成
来源:https://blog.csdn.net/qq_48591625/article/details/108190904


猜你喜欢
- 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时
- 本文实例讲述了C#数据结构之单链表(LinkList)实现方法。分享给大家供大家参考,具体如下:这里我们来看下“单链表(LinkList)”
- 这是一篇关于LIstView实现动态数据渲染的文章! 首先我们讲讲数据是如何来规划的 一般情况下我们有两种规划方案前提比如我们数据
- 起因曾经用过西门子出的 * , 好处是直接有SDK开发包, 不会硬件开发也能直接使用缺点也是明显的, 就是只支持Windows系统, 另外就
- 配置详情pom.xmldependency> <groupId>com.baomidou<
- 怎么使用异步,就是用委托进行处理,如果委托对象在调用列表中只有一个方法,它就可以异步执行这个方法。委托类有两个方法
- 差不多一年前在自己的项目中用过这效果,虽然很简单,但还是写写。1、首先在你的res目录下新建anim子目录,并在anim目录下新建两个文件:
- 现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别:java项目:在c
- 垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法(你可以 写程序验证这个结论),一般的纯Java编写的Class不需要重新
- 一、指标监控引入jar包: <dependency> &nb
- Android 中 Tweened animation的实例详解Tweened animation有四种类型,下面主要介绍Scale类型。运
- 详解Android Studio正式签名进行调试的实现步骤在Android Studio中,可以使用Gradle进行打包时自动签名。其实An
- hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们
- 在[高并发Java 二] 多线程基础中,我们已经初步提到了基本的线程同步操作。这次要提到的是在并发包中的同步控制工具。1. 各种同步控制工具
- 这篇文章主要介绍了如何基于LoadingCache实现Java本地缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式
- 简介Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法
- Java接口回调产生接口回调的场景在现实生活中,产生接口回调的场景很简单,比如我主动叫你帮我做一件事,然后你做完这件事之后会通知我,&quo
- 多播委托简介每一个委托都是继承自MulticastDelegate,也就是每个都是多播委托。带返回值的多播委托只返回最后一个方法的值多播委托
- 为哪些方法代理?实现自己 * ,首先需要关注的点就是,代理对象需要为哪些方法代理? 原生JDK的 * 的实现是往上抽象出一层接口,让目标