首先说明一下我没有完全明白poi的所有功能,我现在写的这个呢是我通过提前做好一个excel模板,通过下载模板导入数据库
1,导入poi所用的包我用的是poi-3.6,现在有更高版本的
2,通过jsp js ext 等等来写一个下载模板的功能
模板的例子:
----------------------------------
1
2
3序号 姓名
4NO NAME
51 朱肖磊
excel sheet1 改为你数据的表名 sheet2改为“请勿修改”这里随便起名目的是你在后台读取里面的几个数据这几数据是在excel的Z1列写上4,AA1列写上表名这样写的目的是见下面的后台是为了读取excel的第四列是数据库字段名
----------------------------------
例子:
<%
String filePath= path + "//" + filenamecn;
java.io.FileInputStream bis = null;
java.io.OutputStream bos = null;
try
{
response.setCharacterEncoding("iso8859-1");
response.setContentType("application/unknown");
response.addHeader("Content-Disposition","attachment; filename=\""+ new String(filenamecn.getBytes("gb2312"),"iso8859-1"));
bis = new java.io.FileInputStream(filePath);
bos = response.getOutputStream();
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length)))
{
bos.write(buff, 0, bytesRead);
}
}catch (Exception e)
{
%>
<script type="text/javascript">
alert('系统找不到该文件');
</script>
<%
e.printStackTrace();
}
finally
{
if (bis != null){
bis.close();
out.clear();
out = pageContext.pushBody();
}
}
%>
3,接着是导入excel 我用的是ext
var fp = new Ext.FormPanel({
renderTo: 'fi-form',
fileUpload: true,
width: 550,
autoHeight: true,
bodyStyle: 'padding: 10px 10px 10px 10px; margin: 10px 10px 10px 10px;',
labelWidth: 120,
defaults: {
anchor: '95%',
allowBlank: false,
msgTarget: 'side'
},
items: [
{
xtype: 'fileuploadfield',
id: 'form-file',
emptyText: '请选择一个Excel文件',
fieldLabel: 'Excel数据文件',
name: 'theFile',
buttonCfg: {
text: '浏览'
}
}],
buttons: [{
text: '导入',
handler: function(){
var fileName = document.getElementById('form-file').value;
var hzm = fileName.split('.');
var strs = fileName.split('\\');
var hzmValue=hzm[hzm.length-1];
var strsValue=strs[strs.length-1];
if(hzmValue!='xls'){
parentIndex.showMessageBox("您上传的文件不符合格式要求,不允许上传!", 2);
}else
{
if(strsValue.length>50)
{
parentIndex.showMessageBox("文件名不能超过50个字", 2);
}else
{
if(fp.getForm().isValid()){
fp.getForm().submit({ url: '../ImportExcelApdm.do?tablename=<%=tableName%>',
waitMsg: '正在上传文件...',
waitTitle:'文件导入',
success: function(fp, o){
var info = '文件"'+o.result.file+'"导入成功!';
info += "<br>"+o.result.info;
//msg('导入成功', info ,Ext.Msg.OK);
//parentIndex.showMessage('',2);
Ext.Msg.alert('导入成功', info);
//parentIndex.storeMap['<%=random%>'].reload();
gridReload('<%=reloadString%>');
},
failure: function(fp, o){
var err = '文件"'+o.result.file+'"导入失败!';
err += "<br>共发现<span style='color:red'>"+o.result.countError+"</span>处错误。";
err += "<br>请按照填表说明正确填写后进行导入。";
err += "<br><br> 是否查看详细错误报告?";
msgErr('导入失败', err ,Ext.Msg.ERROR,processErr(o));
}
});
}
}
}
}
}]
});
4,后台处理导入进来的模板信息
FormFile theFile = inspectimportForm.getTheFile();
String tableName = request.getParameter("tablename");
Excel excel = new Excel();
DataImportApdm dataImport = new DataImportApdm();
HashMap map = new HashMap();
Map mapResult = new HashMap();
mapResult.put("file", theFile.getFileName());
String now = DateTime.getDate();
int currentRow = 0;
try{
//加载
//dataImport.init(tableName);
excel.initExcel(theFile.getInputStream());
//取得excel模板中的表名
Object[] keys = excel.getRow("请勿修改",0);
Object[] oldkeys = excel.getRow("请勿修改",0);
if(keys==null||keys.length<27||!String.valueOf(keys[26]).trim().toUpperCase().equalsIgnoreCase(tableName.toUpperCase())){
throw new Exception("您选择的Excel文件不是有效的"+tableName+"模板!");
}
String rCount=keys[25]+"";
int engListRowCount=0;
try {
engListRowCount=(int)Double.parseDouble(rCount);
} catch (Exception e) {
throw new Exception("英文列的行数设置错误,请修改模板!");
}
//取得excel模板中的英文字段名称(第4行)
keys = excel.getRow(engListRowCount-1);
for(int i=0;i<keys.length;i++){
keys[i] = String.valueOf(keys[i]).toUpperCase().trim();
}
// 取得excel模板中的中文字段名称(第3行)
Object[] fieldNameCn = null;
Map mapFieldName = new HashMap();
int rn = excel.getRowNum(); //所有行数
if(rn<=engListRowCount-1){
throw new Exception("您选择的Excel文件的内容格式不正确!");
}
if(rn==engListRowCount){
throw new Exception("您选择的Excel文件没有数据!");
}
for (int j = 2; j < engListRowCount-1; j++) {
// 取得excel模板中的中文字段名称
fieldNameCn = excel.getRow(j);
if(fieldNameCn!=null){
for(int i=0;i<fieldNameCn.length;i++){
if(fieldNameCn[i]!=null){
mapFieldName.put(keys[i], fieldNameCn[i]);
}
}
}
}
//读取excel模板中的数据 第4行以下的部分
for(currentRow=engListRowCount; currentRow<rn; currentRow++){
map = new HashMap();
Object[] objs =null;
try {
objs = excel.getRow(currentRow);
} catch (Exception e) {
e.printStackTrace();
}
//读取给对象添加数据
if(objs==null)break;
for(int j=0;j<objs.length&&j<keys.length;j++){
String data = (objs[j]+"").trim();
map.put(keys[j], data);
}
String PROJECTEVENTID = (String)map.get("PROJECTEVENTID");//从模板里读取字段列的数据
//这里呢有个问题因为excel模板读取的时候并不是NULL或者“”而是“null”的字符串
所以要进行判断
if (PROJECTEVENTID!=null && !PROJECTEVENTID.equals("") && !"null".equals(PROJECTEVENTID)){
//将这些读取到的数据存放到Map里
Map map = new HashMap();
map.put("PROJECTEVENTID",PROJECTEVENTID);
//然后去执行BO层的添加方法插入到数据库
}
}
5,完事!这只是大概的思路,里面肯定会有验证非空啦,长度啦!等等。。。希望可以帮到大家
6,还有很多导入excel方式,jxl,poi,我这里实现的只是一种而已!