在C#中对Excel进行读写操作时,先引用两个个类库NPOI.dll和Ionic.Zip.dll。
对EXcel文件读取操作:
a) 首先,对文件的操作都需要使用FileStream
FileStream file=new FileStream(“1.xls”,FileMode.Open,FileAccess.Read);
b) 对Excel工作薄操作时使用引用的NPOI类库中的一个类HSSFWorkbook
Workbook wkb=new HSSFWorkbook(filestream)
//HSSFWorkbook类实现了Workbook接口
对excel工作薄获取时需要HSSFWorkbook带参数的构造方法,参数为FileSteam的对象
c) 拿到工作薄厚获取其中的表:
Sheet sheet=wkb.GetSheet(“Sheet1”);//参数为工作薄中的表明
d) 获取表中的每一行,需要进行遍历
For(int i=0;i<sheet.LastRowNum+1;i++)//以最后一个为空的行为终点
{
Row row=sheet.GetRow(i);//获取第i行的数据
For(int j=0;j<row.LastCellNum;j++)//以最后一个有数据的cell为终点
{
Cell cell=row.GetCell(j);//获取第j个表格数据
If(cell!=null)
{
String str=cell.StringCellValue;//获取表格数据
}
}
}
完整的获取工作薄中数据
// 读取Excel文件,使用流操作
using (FileStream file = new FileStream("1.xls", FileMode.Open, FileAccess.Read))
{
// 工作薄使用Workbook表示
using (Workbook wkb = new HSSFWorkbook(file))
{
// 拿到工作簿以后
using (Sheet sheet = wkb.GetSheet("Sheet2"))
{
// 遍历行
// 这个以最后一个为空的行
for (int i = 0; i < sheet.LastRowNum + 1; i++)
{
Row row = sheet.GetRow(i);
// 单元格是以最后一个有数据的cell为最后一个
for (int j = 0; j < row.LastCellNum; j++)
{
Cell cell = row.GetCell(j);
if (cell != null)
{
string str = cell.StringCellValue;
Console.Write(str + "\t");
}
else
{
Console.Write("\t");
}
}
Console.WriteLine();
}
}
}
}
创建工作薄
由于依旧是对于文件的操作,所以用FileStream类先创建一个文件
FileStream file=File.Create(“excel.xls”);
创建一个新的工作薄
Workbook wkb=new HSSFWorkbook()
创建一个表
Sheet sheet=wkb.CreateSheet(“sheetName”);
创建行
Row row=sheet.CreateRow(3);//创建行,参数为第几行
Cell cell=row.CreateCell(3,CellType.STRING)//创建表格,参数为表格在第几列,类型
cell.SetCellValue(“cellValue”);//表格中的数据
wkb.Write(file);把工作薄写入到文件中去
完整代码:
using(FileStream file = File.Create("excel.xls"))
{
using (Workbook wkb = new HSSFWorkbook())
{
// 创建Sheet等
using (Sheet sheet = wkb.CreateSheet("一个默认的名字"))
{
// 创建行
Row row = sheet.CreateRow(3);
Cell cell = row.CreateCell(3, CellType.STRING);
cell.SetCellValue("我是一个字符串");
wkb.Write(file);
}
}
}
数据导入
先用文件流创创建一个Excel表
FileStream file=new FileStream(“ExcelName.xls”,FileMode.Create,FileAccess.Write);
Workbook wkb=new HSSFWorkbook()//创建工作薄
Sheet sheet=wkb.CreateSheet(“sheetName”);//创建表
StreamReader reader=new StreamReader(“name.txt”);获取文件读取流
完整代码:
FileStream file = new FileStream("name.xls", FileMode.Create, FileAccess.Write);
using (Workbook wkb = new HSSFWorkbook())
{
using (Sheet sheet = wkb.CreateSheet("名字"))
{
using (StreamReader reader = new StreamReader("name.txt"))
{
string temp;
int index = 0;
while ((temp = reader.ReadLine()) != null)
{
// 导入每一行
string[] arr = temp.Split(new char[] { '\t', ' ' }, StringSplitOptions.RemoveEmptyEntries);
// 姓名 性别 年龄
Row row = sheet.CreateRow(index);
// 姓名的单元格
Cell cellName = row.CreateCell(0, CellType.STRING);
cellName.SetCellValue(arr[0]);
row.CreateCell(1, CellType.STRING).SetCellValue(arr[1]);
row.CreateCell(2, CellType.NUMERIC).SetCellValue(Convert.ToInt32(arr[2]));
index++;
}
wkb.Write(file);
}
}
}
file.Close();
file.Dispose();
数据导出
从数据库里把读出来的数据导出到excel表中。首先要先创建一个excel文件、工作薄、表。然后从数据库中逐条读取出数据再把数据放入到新创建的表中。
FileStream file=File.OpenWrite(“Student.xls”);//创建一个excel文件
Workbook wkb=new HSSFWorkbook()//创建工作薄
Sheet sheet=wkb.CreateSheet(“sheetName”);创建表
SqlDataReader reader=SQLHelper.ExevuteReader(sql);//从数据库中读取数据
Row rowHead=sheet.CreateRow(0);//创建行,用于存放表头
//创建表头
for(int i=0;i<reader.FieldCount;i++)//遍历表
{
Cell cell=rowHead.CreateCell(I,CellType.STRING);//创建表格存放表头数据
Cell.SetCellValue(reader.GetName(i));//获取数据库中每一列的列名作为表头存放在表中
}
把表中的数据存放到表中
While(reader.Read())
{
Row rowBody=sheet.CreateRow(index);//创建行
//为每一行创建表格存放数据库中读取出来的数据
for(int i=0;i<reader.FieldCount;i++)//
{
Cell c=rowBody.CreateCell(i);
c.SetCellValue(reader[i].ToString());
}
}
完整代码:
using (FileStream file = File.OpenWrite("Student.xls"))
{
using (Workbook wkb = new HSSFWorkbook())
{
using (Sheet sheet = wkb.CreateSheet("入学学员:20120101-20121231"))
{
// 创建多少行
// 创建多少列
// 表头如何实现
using (SqlDataReader reader =
SQLHelper.ExecuteReader(sql))
{
int index = 1;
// 表头
// reader有一个GetName方法
// FieldCount属性
Row rowHead = sheet.CreateRow(0);
for (int i = 0; i < reader.FieldCount; i++)
{
Cell cell = rowHead.CreateCell(i, CellType.STRING);
cell.SetCellValue(reader.GetName(i));
}
while (reader.Read())
{
// 写数据
Row rowBody = sheet.CreateRow(index);
for (int i = 0; i < reader.FieldCount; i++)
{
// 循环每一列
Cell c = rowBody.CreateCell(i);
c.SetCellValue(reader[i].ToString());
}
index++;
}
// 写到流中
wkb.Write(file);
}
}
}
}
案例