使用方法:
1. 本方法使用的取出excel使用的方法是一个叫NPOL的using包下的方法,在网上有许多用法除了可以excel导入导出外,还可以多doc,ppt做操作,有兴趣可以自行研究这个方法。
案例包下载:链接:http://pan.baidu.com/s/1slm1DEH 密码:mcju
npol使用手册:链接:http://pan.baidu.com/s/1slU0WY5 密码:bggv
NPOI官方网站:http://npoi.codeplex.com/
可以到此网站上去下载最新的NPOI组件版本。
2. 案例包使用方法(有一个案例包):
private void btnImport_Click(object sender, EventArgs e)
{
InitializeWorkbook(@"C:\Users\Administrator\Desktop\零售加盟系统\xxxxx.xls"); //这一步操作,是为了打开excel进去到里面去控制它。
ConvertToDataTable(27);//这一个方法就是调用excel的方法,这里参数表示,要读取的列数ps:暂时还未找到让它自己识别最后一列的方法
dataGridView1.DataSource = dataSet1.Tables[0];
}
完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
namespace ImportXlsToDataTable
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
NPOI.SS.UserModel.IWorkbook hssfworkbook;
void InitializeWorkbook(string path)
{
string fileExt = Path.GetExtension(path); //返回指定的路径字符串的扩展名
using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read)) //打开EXCLE文件的方法
{
if (fileExt == ".xls")
{
hssfworkbook = new HSSFWorkbook(file);
}
else if (fileExt == ".xlsx")
{
hssfworkbook = new XSSFWorkbook(file);
}
}
}
void ConvertToDataTable(int count) //这里参数表示,要读取的列数。ps:暂时还未找到让它自己识别最后一列的方法
{
ISheet sheet = hssfworkbook.GetSheetAt(0); //在Excel文档中,第一张工作表的缺省索引是0
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();//获得某一个Sheet的所有IRow
DataTable dt = new DataTable();
for (int j = 0; j <= count; j++)//给DataTable添加列名
{
//dt.Columns.Add(Convert.ToChar(((int)'A')+j).ToString());
dt.Columns.Add("F"+j );
}
while (rows.MoveNext())//循环完所以数据行
{
IRow row = (IRow)rows.Current;//当前行的所有单元格
DataRow dr = dt.NewRow();//实例化一个新的数据行
for (int i = 0; i < row.LastCellNum; i++)//LastCellNum最后一行行标,比行数小1
{
ICell cell = (ICell)row.GetCell(i);//读取当前行的第I个单元格
if (cell == null)
{
dr[i] = null;
}
else
{
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
dataSet1.Tables.Add(dt);
//for (int i = 0; i <= dt.Rows.Count - 1; i++)
//{
// // for (int j = 0; j < 11; j++)
// // {
// String Content = dt.Rows[i]["A"].ToString().Trim();
// Console.WriteLine("{0}", Content);
// // }
//}
}
private void btnImport_Click(object sender, EventArgs e)
{
InitializeWorkbook(@"C:\Users\Administrator\Desktop\零售加盟系统\C1JSW201702B1.xls");
ConvertToDataTable();
dataGridView1.DataSource = dataSet1.Tables[0];
}
//switch(cell.CellType)
//{
// case HSSFCellType.BLANK:
// dr[i] = "[null]";
// break;
// case HSSFCellType.BOOLEAN:
// dr[i] = cell.BooleanCellValue;
// break;
// case HSSFCellType.NUMERIC:
// dr[i] = cell.ToString(); //This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number.
// break;
// case HSSFCellType.STRING:
// dr[i] = cell.StringCellValue;
// break;
// case HSSFCellType.ERROR:
// dr[i] = cell.ErrorCellValue;
// break;
// case HSSFCellType.FORMULA:
// default:
// dr[i] = "="+cell.CellFormula;
// break;
//}
}
}
4.原理方面:
个人理解,这个方法体对excel的操作也是逐列的每一个单元格一个一个的读取。除了可以做这个外还可以往excel写入数据。Npol这个using有着对excel极大的操作,是目前兼容性最高的方法不需要用户去装载任何东西,哪怕用户没有装excel这个软件。