NPOI

NPOI使用

NPOI excel文件读取创建操作

在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 + " ");

                                }

                                else

                                {

                                    Console.Write(" ");

                                }

                            }

                            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[] { ' ', ' ' }, 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);

                        }

                    }

                }

         }

案例

 

原文地址:https://www.cnblogs.com/reganLi/p/3412138.html