当前位置: 代码迷 >> Web前端 >> poi 读写excel 【给小弟我发表点意见】
  详细解决方案

poi 读写excel 【给小弟我发表点意见】

热度:362   发布时间:2012-10-16 09:57:37.0
poi 读写excel 【给我发表点意见】
首先说明一下我没有完全明白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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否查看详细错误报告?";
                    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,我这里实现的只是一种而已!
  相关解决方案