zoukankan      html  css  js  c++  java
  • C#的Excel基本操作

    由于项目的需要,从一开始接触C#就在操作Excel。从网上查看的资料上,个人知道3种操作Excel数据库的方法。

    1、SQL操作数据库。通过SQL语言操作Excel数据库。之前一直用这个办法。但是问题就是Excel版本不同,OleDbConnection使用的连接字符命令是不同的。为了保证通用性,其实项目中一直都在使用office2003的.xls格式。SQL语句常用的多看看就知道怎么用了。(有空整理下自己设计的一些函数吧。)

    2、Excel对象库的引用。移植性有问题,要是被移植的对象装的office版本不一样会有问题的。没有细看。

    3、采用第三方提供的动态链接库。如NPOI,myexcel。这些动态链接库可移植性强,没有被移植对象的环境限制。虽然NPOI只适用于office2003版本的,但是这就足够了,Excel仅仅是我们使用的数据库罢了,移植程序的时候不出问题就好了,没有其他要求。目前在用NPOI实现项目需要的一些基本内容:读、写。设计了三个函数。

    另外,可以去看看大神写的关于操作Excel的东东

    http://www.yongfa365.com/item/DataGridViewToExcel.html

    以下是我自己写的操作函数,功能比较单一。。

    读函数,将指定位置、表名的数据存为二维数组返回。 

     1         /*
     2          * 本函数正常运行有一些必要的限制。必须从第一行开始连续有数据,而且每一行数据列数还是一样的。
     3          * 不过没问题,因为数据本来就是我们写的,按此格式写就好了。
     4          * **********************************************************************************
     5          * 如果要实现更通用的读,就需要更多的判断sheet.TopRow、sheet.LastRowNum、
     6          * sheet.PhysicalNumberOfRows联合判断对应row、cell是否null
     7          */
     8         public static void ReadExcel(string FilePath, string SheetName, out double[,] Matrix)
     9         {
    10             using (FileStream file = File.OpenRead(FilePath))
    11             {
    12 
    13                 NPOI.HSSF.UserModel.HSSFWorkbook wk = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
    14                 NPOI.SS.UserModel.ISheet sheet = wk.GetSheet(SheetName);
    15                 if (sheet.PhysicalNumberOfRows != 0)
    16                 {
    17                     //由于sheet.PhysicalNumberOfRows的值会随时的变动,故先存起来
    18                     int RowNum = sheet.PhysicalNumberOfRows;
    19                     NPOI.SS.UserModel.IRow row = sheet.GetRow(0);
    20                     Matrix = new double[sheet.PhysicalNumberOfRows, row.LastCellNum];
    21 
    22                     for (int j = 0; j < RowNum; j++)
    23                     {
    24                         row = sheet.GetRow(j);
    25                         for (int k = 0; k < row.LastCellNum; k++)
    26                         {
    27                             NPOI.SS.UserModel.ICell cell = row.GetCell(k);
    28                             Matrix[j, k] = Convert.ToDouble(cell.ToString());
    29                         }
    30                     }
    31                 }
    32                 else
    33                 {
    34                     Matrix = null;
    35                 }
    36             }
    37         }

     写函数。将二维数组中的数据写到指定目录、表名的Excel中。写之前先将原数据删除了。

     1         /*
     2          * 先删除表内的数据然后在写入新的数据
     3          * * **********************************************************************************
     4          * 从第一行连续的写入数据,每一行数据列数一样。
     5          */
     6         public static void WriteExcel(string FilePath, string SheetName, double[,] Matrix)
     7         {
     8             using(FileStream file = File.OpenRead(FilePath))
     9             {
    10                 NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
    11                 NPOI.SS.UserModel.ISheet sheet =  workbook.GetSheet(SheetName);
    12                 //由于sheet.PhysicalNumberOfRows的值会随时的变动,故先存起来
    13                 int RowNum = sheet.PhysicalNumberOfRows;
    14                 for (int i = 0; i < RowNum; i++)
    15                 {
    16                     sheet.RemoveRow(sheet.GetRow(i));
    17                 }
    18 
    19                 NPOI.SS.UserModel.IRow row;
    20                 for (int j = 0; j < Matrix.GetLength(0); j++)
    21                 {
    22                     row = sheet.CreateRow(j);
    23                     for (int k = 0; k < Matrix.GetLength(1); k++)
    24                     {
    25                         //如果用数字类型存,数字太小的会转为科学计数法形式,这样就读的时候读不出来。
    26                         row.CreateCell(k).SetCellValue(Matrix[j, k].ToString());
    27                     }
    28                 }
    29                 //写之后,需要调用Write函数,才算成功。
    30                 FileStream fileSave = File.OpenWrite(FilePath);
    31                 workbook.Write(fileSave);
    32                 fileSave.Close();
    33             }
    34         }

     将二维数组插入到指定表格的尾部。

     1         /*
     2          * 向Excel中添加数据。需保证Excel中的从第一条开始连续有数据。
     3          */
     4         public static void AppendExcel(string FilePath, string SheetName, double[,] Matrix)
     5         {
     6             using (FileStream file = File.OpenRead(FilePath))
     7             {
     8                 NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(file);
     9 
    10                 NPOI.SS.UserModel.ISheet sheet = workbook.GetSheet(SheetName);
    11                 NPOI.SS.UserModel.IRow row;
    12 
    13                 for (int i = 0; i < Matrix.GetLength(0); i++)
    14                 {
    15                     row = sheet.CreateRow(sheet.PhysicalNumberOfRows);
    16                     for (int j = 0; j < Matrix.GetLength(1); j++)
    17                     {
    18                         row.CreateCell(j).SetCellValue(Matrix[i, j].Tostring());
    19                     }
    20                 }
    21 
    22                 FileStream fileSave = File.OpenWrite(FilePath);
    23                 workbook.Write(fileSave);
    24                 fileSave.Close();
    25             }
    26         }
  • 相关阅读:
    常用模块
    python里面的奇技淫巧
    day_06、面向对象(二)
    day_06、面向对象
    day_06、递归、二分查找
    day_05、内置函数、匿名函数
    day_05、迭代器、生成器
    day_04、函数
    php调用webservice接口
    php在命令行输出进度条
  • 原文地址:https://www.cnblogs.com/tqianly/p/3647961.html
Copyright © 2011-2022 走看看