asp教程.net 把多个excel导入到多个datatable中二种方法
Microsoft.Office.Interop.Excel.Application TheExcelApp=new Microsoft.Office.Interop.Excel.Application();//默认情况下有三个工作表
TheExcelApp.Visible=false;
int colIndex,rowIndex
colIndex=1;
//第一行输出字段名
foreach(DataColumn dc in dt.Columns)//假设数据在dt表中
{
TheExcelApp.Worksheets("sheet1").Activate();//让sheet1称为当前工作表,以便写入数据
TheExcelApp.Cells(1,colIndex).value=dc.ColumnName;
}
//从第二行开始写入数据
for(colIndex=0;colIndex<dt.Columns.Count-1;colIndex++)
{
for(rowIndex=0;rowIndex<dt.Rows.Count-1;rowIndex++)
{
//Excle的行列都是从1开始算,所以从row+2
TheExcelApp.Cells(row+2,colIndex+1).value=dt.Rows[rowIndex][colIndex];
}
TheExcelApp.ActiveSheet.columns(colIndex+1).autofit();//自动调整宽度
}
TheExcelApp.Worksheets("sheet1").saveas(fileName);//保存
//方法二
直接用using(养成好习惯,呵呵)。
HSSFWorkbook hssfworkbook;
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);
}
}
接下来我们要开始写最重要的函数ConvertToDataTable,即把HSSF的数据放到一个DataTable中。
HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
//TODO::Create DataTable row
for (int i = 0; i < row.LastCellNum; i++)
{
HSSFCell cell = row.GetCell(i);
//TODO::set cell value to the cell of DataTables
}
上面的结构大家都应该能看懂吧,无非就是先遍历行,再遍历行中的每一列。这里引出了一个难点,由于Excel的单元格有好几种类型,类型不同显示的东西就不同,具体的类型有 布尔型、数值型、文本型、公式型、空白、错误。
public enum HSSFCellType
{
Unknown = -1,
NUMERIC = 0,
STRING = 1,
FORMULA = 2,
BLANK = 3,
BOOLEAN = 4,
ERROR = 5,
}
这里的HSSFCellType描述了所有的类型,但细心的朋友可能已经发现了,这里没有日期型,这是为什么呢?这是因为Excel底层并没有一定 日期型,而是通过数值型来替代,至于如何区分日期和数字,都是由文本显示的样式决定的,在NPOI中则是由HSSFDataFormat来处理。为了能够 方便的获得所需要的类型所对应的文本,我们可以使用HSSFCell.ToString()来处理。
于是刚才的代码则变成了这样:
HSSFCell cell = row.GetCell(i);
if (cell == null)
{
dr[i] = null;
}
else
{
dr[i] = cell.ToString();
}
}
dt.Rows.Add(dr);
}
|