• .NET使用NPOI将数据导出/导入到Excel文件


          现在多数软件都支持Excel的导入导出功能。因为将软件中的数据导出到Excel中以后,财务专员就可以很方便的操作这些数据了。这样可以节省很多工作量。并且,有数据导入功能可以使用户启用软件时,不必花费时间就可以将上万条记录导如到软件系统的数据库中。大大减少了用户的工作量,否则,用户只能乖乖的一条条录入了,如果录入后没保存,那就只能…..,大家懂的。

          今天咱们就来看下如何使用NPOI将程序中的数据导出的Excel文件。当然,将程序中的数据导出到Excel文件的方法有很多。但本人以为NPOI的最大优点就是即使你心爱的电脑没有安装office或者wps,那么依然可以正常导出。但是如果使用office组件类库的方式,那么就不敢恭维了…

          言归正传,下面咱们一起来看下NPOI的伟大魅力吧!

          这里我带领大家一起来写个小例子,大家就会掌握NPOI的用法了。

          第1步:请大家新建一个Winfrom窗体应用程序命名为ExportOrImport,在窗体上放一个DataGridView控件和一个button控件。

          第二步:在当前项目中新建一个lib文件夹,并且将如下类库复制到该文件夹下,然后右键点击”引用”→”添加引用”,找到lib的各个dll文件,完成添加。

          第三步:在项目中引入如下命名空间:

            using NPOI.HSSF.UserModel;

            using NPOI.HPSF;

            using NPOI;

             using System.IO;

         第四步:通过ADO.NET从数据库中读取数据到DataGridView中

               string str = "data source=.;initial catalog=Myschool;uid=sa";

                SqlConnection con = new SqlConnection(str);

                string sql = "select studentno,studentname,address,birthday from student";

                SqlDataAdapter da = new SqlDataAdapter(sql,con);

                DataSet ds = new DataSet();

                da.Fill(ds, "Student");

                dataGridView1.DataSource = ds.Tables[0];

         第五步:将DataGridView中的数据导出到Excel文件中

              不多说了 ,直接上代码

              //通过SaveFileDialog类弹出一个保存对话框

                SaveFileDialog sfd = new SaveFileDialog();

                //设置文件的保存类型,默认选中Excel文件

                sfd.Filter = "Excel文件|*.xls";

                //设置默认保存文件名称

                sfd.FileName = "学生信息表";

                //如果用户点击了保存对话框的确定按钮

                if (sfd.ShowDialog()==DialogResult.OK)

                {

                    //获取到Excel文件名

                    string filename = sfd.FileName;

                    //获取学生列表

                    //List<Student> list = dataGridView1.DataSource as List<Student>;

                    //内存中创建一个空的Excel文件

                   HSSFWorkbook workbook = new HSSFWorkbook();

                  

                    //在Excel文件上通过对HSSFSheet创建一个工作表

                    HSSFSheet sheet = workbook.CreateSheet("students");

                    //给工作表上添加一行

                    HSSFRow row1 = sheet.CreateRow(0);

                    //在添加的航上创建一个列

                    HSSFCell cell1 = row1.CreateCell(0,HSSFCell.CELL_TYPE_STRING);

                    //设置该列的值

                    cell1.SetCellValue("学号");

     

                    cell1 = row1.CreateCell(1, HSSFCell.CELL_TYPE_STRING);

                    cell1.SetCellValue("学生姓名");

     

                    cell1 = row1.CreateCell(2, HSSFCell.CELL_TYPE_STRING);

                    cell1.SetCellValue("家庭住址");

     

                    cell1 = row1.CreateCell(3, HSSFCell.CELL_TYPE_STRING);

                    cell1.SetCellValue("出生日期");

                    //遍历dataGridView中的所有列,然后将列添加到Excel工作表中

                    for (int i = 1; i <=dataGridView1.Rows.Count; i++)

                    {

                        //设置字体

                        HSSFFont font = workbook.CreateFont();

                        //字体名称

                        font.FontName = "华文行楷";

                        //设置字体大小

                        font.FontHeightInPoints = 25;

     

                        //设置列的样式

                        HSSFCellStyle style1 = workbook.CreateCellStyle();

                        //设置列的背景色

                        style1.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.ORANGE.index;

                        //设置填充边框样式

                        style1.FillPattern = HSSFCellStyle.SOLID_FOREGROUND;

                        //设置字体显示样式

                        style1.SetFont(font);

     

                        HSSFCellStyle style2 = workbook.CreateCellStyle();

                        style2.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.YELLOW.index;

                        style2.FillPattern = HSSFCellStyle.SOLID_FOREGROUND;

                      

     

                        HSSFRow row = sheet.CreateRow(i);

                        HSSFCell cell = row.CreateCell(0, HSSFCell.CELL_TYPE_NUMERIC);

                        cell.CellStyle = style1;

                        cell.SetCellValue(dataGridView1.Rows[i - 1].Cells[0].Value.ToString());

     

                        cell = row.CreateCell(1,HSSFCell.CELL_TYPE_STRING);

                        cell.CellStyle = style1;

                        cell.SetCellValue(dataGridView1.Rows[i-1].Cells[1].Value.ToString());

     

                        cell = row.CreateCell(2, HSSFCell.CELL_TYPE_STRING);

                        cell.CellStyle = style2;

                        cell.SetCellValue(dataGridView1.Rows[i-1].Cells[2].Value.ToString());

     

                        cell = row.CreateCell(3, HSSFCell.CELL_TYPE_STRING);

                        cell.CellStyle = style2;

                        cell.SetCellValue(dataGridView1.Rows[i-1].Cells[3].Value.ToString());

                    }

                    using (FileStream fs=new FileStream(filename,FileMode.OpenOrCreate))

                    {

                        //将内容写入到硬盘中

                        workbook.Write(fs);

                    }

                    MessageBox.Show("导出成功!");

                }

         其实,还有一种思路,这里留给大家去思考。

          接下来咱们看下如何将一个已经存在的Excel文件导入到DataGridView中。

          由于上面对导出做了详细的分析,而导入只是一个逆向的过程,这里就直接看代码了。

           void InitializeWorkbook(string path)

            {

                //read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.

                //book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added.

                using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))

                {

                    hssfworkbook = new HSSFWorkbook(file);

                }

            }

            DataSet ds = new DataSet();

            void ConvertToDataTable()

            {

                HSSFSheet sheet = hssfworkbook.GetSheetAt(0);

                System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

               

                DataTable dt = new DataTable();

                for (int j = 0; j < 5; j++)

                {

                    dt.Columns.Add(Convert.ToChar(((int)'A') + j).ToString());

                }

     

                while (rows.MoveNext())

                {

                    HSSFRow row = (HSSFRow)rows.Current;

                    DataRow dr = dt.NewRow();

     

                    for (int i = 0; i < row.LastCellNum; i++)

                    {

                        HSSFCell cell = row.GetCell(i);

                        if (cell == null)

                        {

                            dr[i] = null;

                        }

                        else

                        {

                            dr[i] = cell.ToString();

                        }

                    }

                    dt.Rows.Add(dr);

                }

                ds.Tables.Add(dt);

            }

            //从Excel导入

            private void button2_Click(object sender, EventArgs e)

            {

                InitializeWorkbook("学生信息表.xls");

                ConvertToDataTable();

     

               dgvexport.DataSource= ds.Tables[0];

            }

         好了,就写到这里吧!希望能对大家有所帮助。

  • 相关阅读:
    Java Project和Web Project 区别
    ScannerTest-------double string
    ScannerDemo------string int
    clearfix 清除浮动的标签
    bootstrap 的布局
    <span>元素
    反省
    Django中ifequal 和ifnotequal的使用
    IndexError: list index out of range的错误原因
    python2和python3同时存在电脑时,安装包时的的命令行
  • 原文地址:https://www.cnblogs.com/weilengdeyu/p/2814353.html
Copyright © 2020-2023  润新知