一聚教程网:一个值得你收藏的教程网站

热门教程

asp.net 把多个excel导入到多个datatable中二种方法

时间:2022-06-25 05:08:17 编辑:袖梨 来源:一聚教程网

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 {
   for(rowIndex=0;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);
}

热门栏目