最近开发一个项目中,用到了一些读excel 的方法,现在做一些记录,
1,通过oleDb进行操作: 这是一次性的将excel 中的内容导入到dataset中的
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +filenewpath ";Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [ sheetname $] ", strConn);
DataSet ds = new DataSet();
oada.Fill(ds);
2,直接通过workbook进行操作,出自(http://www.cnblogs.com/farrell/archive/2008/01/24/1051273.html)
2.1 导入microsoft office/office\excel.exe,不同的版本可能名称会不一样,
2.2 在代码中引入using Microsoft.office.interop.excel
2.3:如果是对一个已经存在的excel文件进行操作则:
Application app=new Application();
Workbook wbook=app.Workbooks.Open("c:\\temp.xls",Type.Missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing);
Worksheet worksheet=(Worksheet)wbook.Worksheets[1];
2.4:如果是新建一个excel文件:
Application app=new Application();
Workbook wbook=app.Workbook.Add(Type.missing);
Worksheet worksheet=(Worksheet)wbook.Worksheets[1];
2.5:设置某个单元格里的内容:
worksheet.Cells[1,2]="列内容"
2.6读取某个单元格里的内容
string temp=((Range)worksheet.Cells[1,2]).Text;
2.7设置某个单元格里的格式
Excel.Range rtemp=worksheet.get_Range("A1","A1");
rtemp.Font.Name="宋体";
rtemp.Font.FontStyle="加粗";
rtemp.Font.Size=5;
2.8 保存新建的内容:
worksheet.SaveAs("c:\\temp.xls",Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing,Type.missing);
3,是通过引用第三方的类库
本人是通过作用NPOI来进行操作的,性能还可以,操作也简单,对excel的操作也是比较方便,
首先在工程中添加以下的文件引用
Ionic.Zip和NPOI这两个文件可以在NPOI官网下载,
然后就是添加以下的头文件
using System.IO
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
NPOI.Util 基础辅助库
NPOI.POIFS OLE2格式读写库
NPOI.DDF Microsoft Drawing格式读写库
NPOI.SS Excel公式计算库
NPOI.HPSF OLE2的Summary Information和Document Summary Information属性读写库
NPOI.HSSF Excel BIFF格式读写库
打开excel文件,
HSSFWorkbook workBook = new HSSFWorkbook(new FileStream(strpath, FileMode.Open));
读取一个sheet
HSSFSheet workSheet = (HSSFSheet)workBook.GetSheetAt(sheetNo);
或者
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
读取行row
HSSFRow headRow = (HSSFRow)workSheet.GetRow(0);
读取一个单元格
string ClientName = sheetRow.GetCell(3).ToString().Trim();
读取内容可以根据类型进行转化(这是读别人的,拿过来用))
由于Excel的单元格有好几种类型,类型不同显示的东西就不同,具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。
public enum HSSFCellType
{
Unknown = -1,
NUMERIC = 0,
STRING = 1,
FORMULA = 2,
BLANK = 3,
BOOLEAN = 4,
ERROR = 5
}
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;
}
以下是一个例子
HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dtSearchedIDs= newDataTable();
dtCol = new DataColumn("Row", System.Type.GetType("System.String"));
dtSearchedIDs.Columns.Add(dtCol);
dtCol = new DataColumn("Col", System.Type.GetType("System.String"));
dtSearchedIDs.Columns.Add(dtCol);
dtCol = new DataColumn("ID1", System.Type.GetType("System.String"));
dtSearchedIDs.Columns.Add(dtCol);
dtCol = new DataColumn("ID2", System.Type.GetType("System.String"));
dtSearchedIDs.Columns.Add(dtCol);
dtCol = new DataColumn("IsIDInExcel", System.Type.GetType("System.Boolean"));
dtSearchedIDs.Columns.Add(dtCol);
while(rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for(inti = 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);
}