您的位置:首页 > 数据库

如何使用NPOI 导出到excel和导入excel到数据库

2013-11-08 10:12 671 查看
近期一直在做如何将数据库的数据导出到excel和导入excel到数据库。

首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/)。

我用的NPOI1.2.5稳定版。

使用这个网址http://tonyqus.sinaapp.com/可以查询你需要的一些资料。

我这次主要做的是数据库的数据导出到excel和导入excel到数据库。下来我说一下自己的思路。

DBToExcel

1.先建一个Model代码如下

publicclassperson{
publicstringPersonId{get;set;}
publicstringPersonName{get;set;}
publicstringPersonSex{get;set;}
publicstringPersonIdCard{get;set;}
}


2.将person转换成list.

publicstaticList<Person>GetData()
{
Personperson=newPerson{PersonId=0};
person.PersonName="张三";
person.PersonSex="男";
person.PersonIdCard=1245896352145825841;
Personperson1=newPerson
{
PersonId=1,
PersonName="李四",
PersonSex="女",
PersonIdCard=1245896352145825841
};
Personperson2=newPerson
{
PersonId=2,
PersonName="王二",
PersonSex="男",
PersonIdCard=1245896352145825841
};
Personperson3=newPerson
{
PersonId=3,
PersonName="麻子",
PersonSex="女",
PersonIdCard=1245896352145825841
};

List<Person>list=newList<Person>();

list.Add(person);
list.Add(person1);
list.Add(person2);
list.Add(person3);

returnlist;
}


3.将list转换成dataset或者datatable

publicstaticDataSetConvertToDataSet<T>(List<T>list)
{
if(list==null||list.Count<=0)
{
returnnull;
}
DataSetds=newDataSet();
DataTabledt=newDataTable(typeof(T).Name);
DataColumncolumn;
DataRowrow;
System.Reflection.PropertyInfo[]myPropertyInfo=typeof(T).GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance);
foreach(Ttinlist)
{
if(t==null)
{
continue;
}
row=dt.NewRow();
for(inti=0,j=myPropertyInfo.Length;i<j;i++)
{
System.Reflection.PropertyInfopi=myPropertyInfo[i];
stringname=pi.Name;
if(dt.Columns[name]==null)
{
column=newDataColumn(name,pi.PropertyType);
dt.Columns.Add(column);
}
row[name]=pi.GetValue(t,null);
}
dt.Rows.Add(row);
}
ds.Tables.Add(dt);
returnds;
}

4.将Datatable转换成Excel

publicstaticHSSFWorkbookDtToExcel(DataSetds,stringsheetName,stringworkName,stringpath)
{
HSSFWorkbookhassfworkbook=newHSSFWorkbook();
DocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company="NPOITeam";
hassfworkbook.DocumentSummaryInformation=dsi;

SummaryInformationsi=PropertySetFactory.CreateSummaryInformation();
si.Subject="NPOISDKExample";
hassfworkbook.SummaryInformation=si;

HSSFSheetsheet1=(HSSFSheet)hassfworkbook.CreateSheet(sheetName);
HSSFRowrow;
HSSFCellcell;

//写字段名
row=(HSSFRow)sheet1.CreateRow(0);
for(inti=0;i<ds.Tables[0].Columns.Count;i++)
{
cell=(HSSFCell)row.CreateCell(i);
cell.SetCellValue(String.Format(ds.Tables[0].Columns[i].ColumnName));
}
//写记录
for(introwIndex=0;rowIndex<ds.Tables[0].Rows.Count;rowIndex++)
{
row=(HSSFRow)sheet1.CreateRow(rowIndex+1);
for(intcolIndex=0;colIndex<ds.Tables[0].Columns.Count;colIndex++)
{
cell=(HSSFCell)row.CreateCell(colIndex);
cell.SetCellValue(String.Format(ds.Tables[0].Rows[rowIndex][colIndex].ToString()));
}
}

//前台调用
//HSSFWorkbooka=.DtToExcel(....)
//a.Write(Response.OutputStream)
////替换以下两句:
//hassfworkbook.Write(HttpContext.Current.Response.outputStrem);
//FileStreamfile=newFileStream(path+"/"+workName+".cls",FileMode.Create);
//hassfworkbook.Write(file);
//file.Close();
returnhassfworkbook;
}


下面把我自己写测试类给大家看看,代码如下。


usingSystem;
usingSystem.Collections.Generic;
usingSystem.Data;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Text;
usingNPOI.HPSF;
usingNPOI.HSSF.UserModel;
usingTest.Model;


namespaceTest
{
classTest
{
privatestaticstringsheetName="测试";
privatestaticstringworkName="test2";
privatestaticstringpath="D:";


publicstaticvoidMain(string[]args)
{


//ConvertToDataSet(GetData());
//前台调用
HSSFWorkbookhassfworkbook=DtToExcel(ConvertToDataSet(GetData()),sheetName,workName,path);
//a.Write(Response.OutputStream)
////替换以下两句:
//hassfworkbook.Write(HttpContext.Current.Response.outputStrem);
FileStreamfile=newFileStream(path+"/"+workName+".xls",FileMode.Create);
hassfworkbook.Write(file);
file.Close();
//DtToExcel(ConvertToDataSet(GetData()),sheetName,workName,path);
}


publicstaticList<Person>GetData()
{
Personperson=newPerson{PersonId=0};
person.PersonName="张三";
person.PersonSex="男";
person.PersonIdCard=1245896352145825841;
Personperson1=newPerson
{
PersonId=1,
PersonName="李四",
PersonSex="女",
PersonIdCard=1245896352145825841
};
Personperson2=newPerson
{
PersonId=2,
PersonName="王二",
PersonSex="男",
PersonIdCard=1245896352145825841
};
Personperson3=newPerson
{
PersonId=3,
PersonName="麻子",
PersonSex="女",
PersonIdCard=1245896352145825841
};


List<Person>list=newList<Person>();


list.Add(person);
list.Add(person1);
list.Add(person2);
list.Add(person3);


returnlist;
}
publicstaticDataSetListToDataSet<T>(List<Person>list)
{
if(list.Count==0)returnnewDataSet();
varproperties=list[0].GetType().GetProperties();
varcols=properties.Select(p=>newDataColumn(p.Name));
vardt=newDataTable();
dt.Columns.AddRange(cols.ToArray());
//list.ForEach(x=>dt.Rows.Add(properties.Select(p=>p.GetValue(x)).ToArray()));
returnnewDataSet{Tables={dt}};
}


publicstaticDataSetConvertToDataSet<T>(List<T>list)
{
if(list==null||list.Count<=0)
{
returnnull;
}
DataSetds=newDataSet();
DataTabledt=newDataTable(typeof(T).Name);
DataColumncolumn;
DataRowrow;
System.Reflection.PropertyInfo[]myPropertyInfo=typeof(T).GetProperties(System.Reflection.BindingFlags.Public|System.Reflection.BindingFlags.Instance);
foreach(Ttinlist)
{
if(t==null)
{
continue;
}
row=dt.NewRow();
for(inti=0,j=myPropertyInfo.Length;i<j;i++)
{
System.Reflection.PropertyInfopi=myPropertyInfo[i];
stringname=pi.Name;
if(dt.Columns[name]==null)
{
column=newDataColumn(name,pi.PropertyType);
dt.Columns.Add(column);
}
row[name]=pi.GetValue(t,null);
}
dt.Rows.Add(row);
}
ds.Tables.Add(dt);
returnds;
}


publicstaticHSSFWorkbookDtToExcel(DataSetds,stringsheetName,stringworkName,stringpath)
{
HSSFWorkbookhassfworkbook=newHSSFWorkbook();
DocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company="NPOITeam";
hassfworkbook.DocumentSummaryInformation=dsi;


SummaryInformationsi=PropertySetFactory.CreateSummaryInformation();
si.Subject="NPOISDKExample";
hassfworkbook.SummaryInformation=si;



HSSFSheetsheet1=(HSSFSheet)hassfworkbook.CreateSheet(sheetName);
HSSFRowrow;
HSSFCellcell;




//写字段名
row=(HSSFRow)sheet1.CreateRow(0);
for(inti=0;i<ds.Tables[0].Columns.Count;i++)
{
cell=(HSSFCell)row.CreateCell(i);
cell.SetCellValue(String.Format(ds.Tables[0].Columns[i].ColumnName));
}
//写记录
for(introwIndex=0;rowIndex<ds.Tables[0].Rows.Count;rowIndex++)
{
row=(HSSFRow)sheet1.CreateRow(rowIndex+1);
for(intcolIndex=0;colIndex<ds.Tables[0].Columns.Count;colIndex++)
{
cell=(HSSFCell)row.CreateCell(colIndex);
cell.SetCellValue(String.Format(ds.Tables[0].Rows[rowIndex][colIndex].ToString()));
}
}


//前台调用
//HSSFWorkbooka=.DtToExcel(....)
//a.Write(Response.OutputStream)
////替换以下两句:
//hassfworkbook.Write(HttpContext.Current.Response.outputStrem);
//FileStreamfile=newFileStream(path+"/"+workName+".cls",FileMode.Create);
//hassfworkbook.Write(file);
//file.Close();
returnhassfworkbook;
}


}
}



里面的相关信息这里不做具体的介绍详情请看http://tonyqus.sinaapp.com/tutorial教程。

ExcelDoDatatable

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Data;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Text;
usingNPOI.HSSF.UserModel;
usingNPOI.SS.UserModel;

namespaceTestNopi
{
publicstaticclassNPOIExcelToTable
{
privatestaticstringpath="D:\aaa.xls";
staticvoidMain(string[]args)
{
AcquireTwoArray(ImportExcelToTable(@"path",0));
}
///<summary>
///将Excel文件中的数据读出到DataTable中(xls)
///</summary>
///<paramname="file"></param>
///<returns></returns>
publicstaticDataSetImportExcelToTable(stringpath,intindex)
{
DataSetds=newDataSet();
DataTabledt=newDataTable();
using(FileStreamfs=newFileStream(@"D:\aaa.xls",FileMode.Open,FileAccess.Read))
{
HSSFWorkbookhssfworkbook=newHSSFWorkbook(fs);

ISheetsheet=hssfworkbook.GetSheetAt(index);
//表头
IRowheader=sheet.GetRow(sheet.FirstRowNum);
List<int>columns=newList<int>();
for(inti=0;i<header.LastCellNum;i++)
{
objectobj=GetValueTypeForXls(header.GetCell(i)asHSSFCell);
if(obj==null||obj.ToString()==string.Empty)
{
dt.Columns.Add(newDataColumn("Columns"+i.ToString()));
}
else
dt.Columns.Add(newDataColumn(obj.ToString()));
columns.Add(i);
}
//数据
for(inti=sheet.FirstRowNum+1;i<=sheet.LastRowNum;i++)
{
DataRowdr=dt.NewRow();
boolhasValue=false;
foreach(intjincolumns)
{
dr[j]=GetValueTypeForXls(sheet.GetRow(i).GetCell(j)asHSSFCell);
if(dr[j]!=null&&dr[j].ToString()!=string.Empty)
{
hasValue=true;
}
}
if(hasValue)
{
dt.Rows.Add(dr);
}
}
ds.Tables.Add(dt);
}
returnds;
}
///<summary>
///获取单元格类型(xls)
///</summary>
///<paramname="cell"></param>
///<returns></returns>
privatestaticobjectGetValueTypeForXls(HSSFCellcell)
{
if(cell==null)
returnnull;
switch(cell.CellType)
{
caseCellType.BLANK://BLANK:
returnnull;
caseCellType.BOOLEAN://BOOLEAN:
returncell.BooleanCellValue;
caseCellType.NUMERIC://NUMERIC:
returncell.NumericCellValue;
caseCellType.STRING://STRING:
returncell.StringCellValue;
caseCellType.ERROR://ERROR:
returncell.ErrorCellValue;
caseCellType.FORMULA://FORMULA:
default:
return"="+cell.CellFormula;
}
}
publicstaticvoidAcquireTwoArray(DataSetds)
{

foreach(DataTabledtinds.Tables)//遍历所有的DataTable
{
foreach(DataRowdrindt.Rows)//遍历所有的行
{
foreach(DataColumndcindt.Columns)//遍历所有的列
{
Console.Write("{0},{1},{2}",dt.TableName,dc.ColumnName,dr[dc].ToString());//表名,列名,单元格数据
}
}

}

}

}
}


导入主要做到把excel转换到datatable,将datatable进行遍历即可。然后将数据插入到数据库中。如果在其中遇到什么问题,可以留言。将会尽力解答你们所遇到的问题,希望相互学习,相互提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: