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
0
投稿
猜你喜欢
- 前言链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表
- 有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码List<Integer> list
- 本文源码:GitHub·点这里 || GitEE·点这里一、Ehcache缓存简介1、基础简介EhCache是一个纯Java的进程内缓存框架
- 这篇文章主要介绍了java split()使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 我们在安装某个APP的时候,基本都会有一个引导页的提示,他们可以打广告,或者介绍新功能的加入和使用说明等。一般都支持滑动并且下面有几个点,显
- 一、关于Spring Cache缓存在现在的应用中越来越重要,Spring从3.1开始定义了org.springframework.cach
- 方式1:dependency 本地jar包<dependency> <groupId>com.jouyp
- MybatisPlus特性•无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑•损耗小:启动即会自动注入基本 CURD,性能
- 简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改
- 一、传递参数既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员(方法、属性、索引器、运算符和构造函数)更改参数的值,并保持该更
- 一、什么是iText?在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Js
- 1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有Su
- 1,什么是Eureka,什么是服务注册与发现 Spring Boot作为目前最火爆的web框架。那么它与Eureka又有什么关联呢?Eure
- 1、AOP基本总结连接点(JoinPoint):连接点是程序运行的某个阶段点,如方法调用、异常抛出等切入点(Pointcut):切入点是Jo
- 运行下面这段代码,观察其结果:package com.test;public class HelloB extends HelloA {pu
- 前言BeanPostProcessor是一个工厂钩子,允许Spring框架在新创建Bean实例时对其进行定制化修改。例如:通过检查其标注的接
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- storm操作zookeeper的主要函数都定义在命名空间backtype.storm.cluster中(即cluster.clj文件中)。
- 一、冻结列DataGridViewColumn.Frozen属性为true时,该列左侧的所有列被固定,横向滚动时固定列不随滚动条滚动而左右移
- 前言在这篇文章里,最后总结处,我说了会讲讲循环依赖中,其中一个类添加@Async有可能会导致注入失败而抛异常的情况,今天就分析一下。一、异常