1、Winform界面布局
2、引用NPOI的dll
3、源码
using NPOI.HSSF.UserModel;//HSSFWorkbook,97-2003版本,excel文件后缀为.xls
using NPOI.SS.UserModel;//IWorkbook,ISheet,IRow,ICell,DateUtil需要此引用
using NPOI.XSSF.UserModel;//XSSFWorkbook,2007版本,excel文件后缀为.xlsx
using System;
using System.Data;
using System.IO;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public static DataTable NPExcelToDataTable(string fileName, string sheetName = "")
{
FileStream fs = null;
IWorkbook workbook = null;//IWorkbook是一个接口,XSSFWorkbook和HSSFWorkbook都继承自此接口
ISheet sheet = null;//ISheet也是一个接口
DataTable dt = new DataTable();
try
{
//【1】读取excel文件,并新建workbook和sheet
fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (fileName.IndexOf(".xls") > 0) // 97-2003版本
workbook = new HSSFWorkbook(fs);
//workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fs);
if (sheetName != "") //是否有传入表名
{
sheet = workbook.GetSheet(sheetName);
}
else
{
sheet = workbook.GetSheetAt(0); //读取第一个sheet
}
//【2】解析excel文件的内容,填充到dt中
if (sheet == null)//工作表中的内容为null时
{
throw new Exception("未找到工作表");
}
dt.TableName = sheet.SheetName;
//解析sheet的第一行数据,添加dt的列头名
int startRow = 0; //开始读取行数
IRow firstRow = sheet.GetRow(startRow); //第一行
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号,即总的列数
for (int i = firstRow.FirstCellNum; i < cellCount; i++)
{
ICell cell = firstRow.GetCell(i);
if (cell != null)
{
string cellValue = cell.StringCellValue;
if (cellValue != null)
{
if (dt.Columns.IndexOf(cellValue) > 0) //如果已经有此列名,则结果>0,列名名称加上“重复列名”和"列的列数i"
{
DataColumn column = new DataColumn(Convert.ToString("重复列名" + cellValue + i));
dt.Columns.Add(column);
}
else
{
DataColumn column = new DataColumn(cellValue);
dt.Columns.Add(column);
}
}
}
}
//添加dt的所有行内容
startRow = startRow + 1;
int rowCount = sheet.LastRowNum; //总行数
for (int i = startRow; i <= rowCount; i++)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; //没有数据的行默认是null
DataRow dataRow = dt.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
ICell cell = row.GetCell(j);
if (cell != null) //同理,没有数据的单元格都默认是null
{
if (cell.CellType == CellType.Formula) //公式时
{
try
{
dataRow[j] = cell.StringCellValue;
}
catch
{
if (DateUtil.IsCellDateFormatted(cell)) //日期时
{
dataRow[j] = cell.DateCellValue;
}
else { dataRow[j] = cell.NumericCellValue; }//数字时
}
}
else { dataRow[j] = cell.ToString(); }
}
}
dt.Rows.Add(dataRow);
}
//使用完excel文件后,一定要关闭
fs.Close();
return dt;
}
catch (Exception ex)
{
if (fs != null)
{
fs.Close();
}
throw new Exception(ex.Message);
}
}
//导入excel数据到datagridview
private void button1_Click(object sender, EventArgs e)
{
try
{
DataTable dt = new DataTable();
dt = NPExcelToDataTable(txt_Path.Text, "");
dataGridView1.DataSource = dt;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//打开文件
private void button2_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "Excel文件|*.xls;*.xlsx";//设置打开文件筛选器
openFileDialog1.Title = "选择Excel文件";//设置打开对话框标题
openFileDialog1.Multiselect = false;//设置打开对话框中只能单选
if (openFileDialog1.ShowDialog() == DialogResult.OK)//判断是否选择了文件
{
txt_Path.Text = openFileDialog1.FileName;//在文本框中显示Excel文件名
}
}
//添加一行内容并保存到excel
private void button3_Click(object sender, EventArgs e)
{
try
{
HSSFWorkbook wk = new HSSFWorkbook();
//创建一个sheet
ISheet sheet = wk.CreateSheet("例子");
//在第一行创建行
IRow row = sheet.CreateRow(0);
//在第一行的第一列创建单元格
for (int i = 0; i < 10; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue("测试" + i);
}
using (FileStream fs = File.OpenWrite(".\\excel.xls"))
{
wk.Write(fs);
}
MessageBox.Show("已新建和保存excel文件");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//更改excel中第一行的数据(除了列头)
private void button4_Click(object sender, EventArgs e)
{
try
{
string tempPath = ".\\excel.xls";
HSSFWorkbook wk = null;
using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
wk = new HSSFWorkbook(fs);
fs.Close();
}
//选定名为"例子"的sheet
ISheet sheet = wk.GetSheet("例子");
//在第二行创建单元格
IRow row = sheet.CreateRow(1);
//为第二行中前10列赋值
for (int i = 0; i < 10; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue("SS" + i);
}
//将编辑值后的workbook保存到excel中
using (FileStream fileStream = File.Open(".\\excel.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
wk.Write(fileStream);
fileStream.Close();
}
MessageBox.Show("成功编辑excel中的值");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//更改excel中第一行的单元格样式(除了列头)
private void button5_Click(object sender, EventArgs e)
{
try
{
HSSFWorkbook wk = null;
string tempPath = ".\\excel.xls";
using (FileStream fs = File.Open(tempPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
wk = new HSSFWorkbook(fs);
fs.Close();
}
ICellStyle cellStyle = wk.CreateCellStyle();
//设置单元格上下左右边框线
cellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
cellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
cellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
cellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.SlantedDashDot;
//文字水平和垂直对齐方式
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
//是否换行
//cellStyle.WrapText = true;
//缩小字体填充
cellStyle.ShrinkToFit = true;
//选定名为"例子"的sheet
ISheet sheet = wk.GetSheet("例子");
//在第二行创建单元格
IRow row = sheet.GetRow(1);
//为第二行中前10列赋值
for (int i = 0; i < 10; i++)
{
ICell cell = row.GetCell(i);
cell.CellStyle = cellStyle;
}
//将编辑值后的workbook保存到excel中
using (FileStream fileStream = File.Open(".\\excel.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
wk.Write(fileStream);
fileStream.Close();
}
MessageBox.Show("格式设置成功,请打开excel文件查看");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
//读取excel中第1列第1行的值(除了列头)
private void button6_Click(object sender, EventArgs e)
{
try
{
string ExcelFilePath = ".\\excel.xls";
NPOI.SS.UserModel.IWorkbook wk = null;
using (FileStream fs = File.Open(ExcelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
if (ExcelFilePath.IndexOf(".xlsx") > 0) // 2007版本
wk = new NPOI.XSSF.UserModel.XSSFWorkbook(fs);
else if (ExcelFilePath.IndexOf(".xls") > 0) // 97-2003版本
wk = new NPOI.HSSF.UserModel.HSSFWorkbook(fs);
fs.Close();
}
ISheet sheet = wk.GetSheetAt(0);//获取第一个sheet
//int count = wk.NumberOfSheets;//获取一个excel文件中sheet的总数
textBox1.Text = sheet.GetRow(0).GetCell(0).StringCellValue;//获取第一行第一列的值
MessageBox.Show("成功读取excel中的值");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
4、运行效果
依次执行下图中的1-6按钮,
可以通过查看程序文件夹中的excel文件来加深理解。
5、NPOI的dll下载地址
链接:https://pan.baidu.com/s/19PgQMhCKviw9aBAjmJHSww
提取码:2omi
文章来源:https://www.toymoban.com/news/detail-412023.html
6、补充【以上步骤只能打开.xls文件(97-2003版本),打不开.xlsx文件(2007版本)】
需要在源码中增加如下引用。相应的dll已更新到5的下载地址中。
文章来源地址https://www.toymoban.com/news/detail-412023.html
到了这里,关于C#【必备技能篇】使用NPOI实现对excel的读取和写入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!