java中poi解析excel(兼容07版本以上及以下:.xls和.xlsx格式)
1 package com.genersoft.cbms.ysbz.ExcelDr.cmd; 2 3 import com.genersoft.cbms.ysbz.ExcelDr.dao.ExcelDrDao; 4 import com.genersoft.cbms.ysbz.ExcelDr.dao.IExcelDrDao; 5 import com.genersoft.cbms.ysbz.ExcelDr.domain.IExcelDrDomain; 6 import com.genersoft.cbms.ysbz.ExcelDr.entity.ExcelDr; 7 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 8 import org.apache.poi.ss.usermodel.Cell; 9 import org.apache.poi.ss.usermodel.Row; 10 import org.apache.poi.ss.usermodel.Sheet; 11 import org.apache.poi.ss.usermodel.Workbook; 12 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 13 import org.loushang.bsp.security.context.GetBspInfo; 14 import org.loushang.bsp.share.organization.OrganFactory; 15 import org.loushang.next.dao.DaoFactory; 16 import org.loushang.next.data.DataSet; 17 import org.loushang.next.data.ParameterSet; 18 import org.loushang.next.data.Record; 19 import org.loushang.next.upload.UploadFile; 20 import org.loushang.next.web.cmd.BaseAjaxCommand; 21 import org.loushang.sca.ScaComponentFactory; 22 23 import java.io.*; 24 import java.net.ServerSocket; 25 import java.util.*; 26 27 /** 28 * Created by lyx on 2016/10/18. 29 */ 30 public class ExcelDrCommand extends BaseAjaxCommand { 31 private static IExcelDrDomain excelDomain = ScaComponentFactory.getService(IExcelDrDomain.class, "excelDomain/excelDomain"); 32 IExcelDrDao exceldao = (IExcelDrDao) DaoFactory.getDao(ExcelDrDao.class.getName()); 33 34 String dynm; 35 36 /** 37 * excel导入 38 */ 39 public void importExcel() { 40 //用来存插到bzsj表里的数据 41 //List<ExcelDr> itemList = new ArrayList<ExcelDr>(); 42 ExcelDr item = new ExcelDr(); 43 44 //获取用户名称 45 String organ_id = GetBspInfo.getBspInfo().getCorporationOrganId();//组织ID 46 String organ_name; 47 if (organ_id == null) { 48 organ_name = "%"; 49 } else { 50 organ_name = OrganFactory.getIOrganProvider().getOrganByOrganId(organ_id).getOrganName();//组织名称 51 } 52 item.setFcsjUser(organ_id); 53 54 String slnm = (String) getParameter("slnm"); 55 item.setFcsjSlnm(slnm); 56 //前台选中的组织的内码编号和名称 57 String zznm = (String) getParameter("zznm"); 58 String zzbh = (String) getParameter("zzbh"); 59 String zzmc = (String) getParameter("zzmc"); 60 //是否选中按组织导入 61 Boolean ifcheck = (Boolean) getParameter("ifcheck"); 62 //前台选中的目标类型的内码编号和名称 63 String faMblx = (String) getParameter("faMblx"); 64 String mblxmc = (String) getParameter("mblxmc"); 65 String mblxbh = (String) getParameter("mblxbh"); 66 //获取前台选中了哪些报表 67 String[] bbbhs = (String[]) getParameter("bbbhs"); 68 69 //不按组织导入时,获取前台选中了哪些组织 70 String[] zzbhs = (String[]) getParameter("zzbhs"); 71 72 //解析excel 73 Record[] records = (Record[]) getParameter("records"); 74 if (records == null || records.length < 1) 75 return; 76 Record record = records[0]; 77 UploadFile file = (UploadFile) record.get("file"); 78 InputStream inputStream = null; 79 try { 80 inputStream = file.getInputStream(); 81 } catch (FileNotFoundException e) { 82 e.printStackTrace(); 83 } catch (IOException e) { 84 e.printStackTrace(); 85 } 86 // 得到工作表 87 if (inputStream == null) { 88 return; 89 } 90 //文件名 91 String url = file.getFileName(); 92 //文件的后缀名 93 String suffix = url.substring(url.lastIndexOf(".")); 94 // HSSFWorkbook book = null; 95 Workbook book=null; 96 /* try { 97 //如果是xlsx格式,则这一步会报错 98 book = new HSSFWorkbook(inputStream); 99 } catch (IOException e) { 100 e.printStackTrace(); 101 }*/ 102 try { 103 if(".xls".equals(suffix)){ 104 //支持07版本以前的excel 105 book= new HSSFWorkbook(inputStream); 106 }else if(".xlsx".equals(suffix)){ 107 //支持07版本以后的excel 108 book = new XSSFWorkbook(inputStream); 109 }else{ 110 System.out.println("不支持的文件类型!"); 111 return; 112 } 113 } catch (IOException e) { 114 e.printStackTrace(); 115 } 116 if (book == null) { 117 return; 118 } 119 //得到一共有几个sheet 120 int sheetnum = book.getNumberOfSheets(); 121 122 //sheet页循环 123 for (int i = 0; i < sheetnum; i++) { 124 boolean ifbbexist = false; 125 boolean ifzzexist = false; 126 boolean ifbbzzexist = false; 127 Sheet sheet = null; 128 sheet = book.getSheetAt(i); 129 if (sheet != null) { 130 //获取sheet页的名称 131 String sheetName = sheet.getSheetName(); 132 //获取报表中的最后一行的行号,则总行数等于它加1 133 int allrow = sheet.getLastRowNum() + 1; 134 135 String sheetzzbh = ""; 136 String[] sheetnmmc = new String[2]; 137 if (ifcheck) { 138 //如果是安组织导入,将得到的sheet页名称分开,以便获取报表编号 139 String[] sheetNames = sheetName.split("\\."); 140 String bbbh = sheetNames[0]; 141 for (int n = 0; n < bbbhs.length; n++) { 142 if (bbbh.equals(bbbhs[n])) { 143 ifbbexist = true; 144 } 145 } 146 if (ifbbexist) { 147 dynm = getDynm(bbbh); 148 item.setFcsjZznm(zznm); 149 item.setFcsjZzbh(zzbh); 150 item.setFcsjZzmc(zzmc); 151 } 152 } else { 153 //将得到的sheet页名称分开,以便获取报表编号 154 String[] sheetNames = sheetName.split("\\."); 155 String bbbh = sheetNames[0]; 156 //将得到的sheet页名称分开,以便获取组织编号 157 sheetzzbh = sheetNames[1].substring(sheetNames[1].indexOf("(") + 1, sheetNames[1].indexOf(")")); 158 //判断此sheet页的报表编号是否是选中的 159 for (int b = 0; b < bbbhs.length; b++) { 160 if (bbbh.equals(bbbhs[b])) { 161 ifbbexist = true; 162 } 163 } 164 //判断此sheet页的组织编号是否是选中的 165 for (int z = 0; z < zzbhs.length; z++) { 166 if (sheetzzbh.equals(zzbhs[z])) { 167 ifzzexist = true; 168 } 169 } 170 if (ifbbexist && ifzzexist) { 171 ifbbzzexist = true; 172 dynm = getDynm(bbbh); 173 sheetnmmc = getZznmmc(sheetzzbh); 174 item.setFcsjZznm(sheetnmmc[0]); 175 item.setFcsjZzbh(sheetzzbh); 176 item.setFcsjZzmc(sheetnmmc[1]); 177 } 178 } 179 //1.(按组织导入)如果sheet页中的报表编号跟前台选中的编号相等,才能导入 180 //2.(不按组织导入)sheet页中的报表编号和组织编号跟前台选中的编号相等,才能导入 181 if ((ifbbexist && ifcheck) || ifbbzzexist) { 182 //获取该报表是否是两栏表头的表格 183 List<String> zhcs = getIfzh(dynm); 184 String ifzh = zhcs.get(0); 185 String kzhs = zhcs.get(1); 186 int kzh = Integer.parseInt(kzhs); 187 //获取该报表数据库里一共有几列 188 int tableCol = getTableCol(dynm); 189 //获取内容行从哪一行开始 190 int rownum = getRownum(dynm); 191 //内容行的行号(从1开始) 192 String mxnm = getMxnm(dynm); 193 DataSet dsc = getSjl(dynm); 194 DataSet dsr = getXxl(dynm); 195 int xxls = getXxls(dynm); 196 int hzbbStat = getStat(dynm, item); 197 //编制行里的行记录 198 List<HashMap<String, Object>> recordsList = getRecList(dynm,mxnm,item); 199 200 int footerRow = getFooternum(dynm); 201 202 //两栏表 203 if(ifzh.equals("1")){ 204 int rowXh = 1; 205 for (int j = rownum; j < rownum+kzh-1; j++) { 206 int firstLan =1; 207 //cell单元格的值 208 String value = ""; 209 Map<Integer, String> dataMap = new HashMap<Integer, String>(); 210 int col = 0; 211 // 得到j的那一行 212 Row rowi = sheet.getRow(j); 213 // 得到该行的所有列 214 Iterator<Cell> cellTitle = rowi.cellIterator(); 215 // 循环标题所有的列 216 while (cellTitle.hasNext()) { 217 if(0<firstLan && firstLan<=tableCol){ 218 Cell cell = (Cell) cellTitle.next(); 219 int type = cell.getCellType(); 220 switch (type) { 221 case 0: 222 Double dValue = (Double) cell.getNumericCellValue(); 223 value = dValue.toString(); 224 break; 225 case 1: 226 value = cell.getStringCellValue(); 227 break; 228 case 3: 229 value = ""; 230 break; 231 } 232 dataMap.put(col, value); 233 col++; 234 }else{ 235 break; 236 } 237 firstLan++; 238 } 239 Date date = new Date(); 240 item.setCreatedtime(date); 241 item.setLastmodifiedtime(date); 242 exceldao.importExcel(dynm, dataMap, item, rowXh,mxnm,recordsList,xxls,hzbbStat,dsc,dsr); 243 rowXh++; 244 } 245 for (int j = rownum; j <= rownum+recordsList.size()-kzh; j++) { 246 int secontLan =1; 247 //cell单元格的值 248 String value = ""; 249 Map<Integer, String> dataMap = new HashMap<Integer, String>(); 250 int col = 0; 251 // 得到j的那一行 252 Row rowi = sheet.getRow(j); 253 // 得到该行的所有列 254 Iterator<Cell> cellTitle = rowi.cellIterator(); 255 // 循环标题所有的列 256 while (cellTitle.hasNext()) { 257 Cell cell = (Cell) cellTitle.next(); 258 if(tableCol<secontLan && secontLan<=tableCol*2){ 259 int type = cell.getCellType(); 260 switch (type) { 261 case 0: 262 Double dValue = (Double) cell.getNumericCellValue(); 263 value = dValue.toString(); 264 break; 265 case 1: 266 value = cell.getStringCellValue(); 267 break; 268 case 3: 269 value = ""; 270 break; 271 } 272 dataMap.put(col, value); 273 col++; 274 } 275 if(secontLan>tableCol*2){ 276 break; 277 } 278 secontLan++; 279 } 280 Date date = new Date(); 281 item.setCreatedtime(date); 282 item.setLastmodifiedtime(date); 283 exceldao.importExcel(dynm, dataMap, item, rowXh,mxnm,recordsList,xxls,hzbbStat,dsc,dsr); 284 rowXh++; 285 } 286 }else{ 287 int rowXh = 1; 288 //正常表 289 for (int j = rownum; j < rownum+recordsList.size(); j++) { 290 //cell单元格的值 291 String value = ""; 292 Map<Integer, String> dataMap = new HashMap<Integer, String>(); 293 int col = 0; 294 // 得到j的那一行 295 Row rowi = sheet.getRow(j); 296 // 得到该行的所有列 297 Iterator<Cell> cellTitle = rowi.cellIterator(); 298 // 循环标题所有的列 299 while (cellTitle.hasNext()) { 300 Cell cell = (Cell) cellTitle.next(); 301 /* cell.getCellType()返回的类型: 302 int CELL_TYPE_NUMERIC = 0; 303 int CELL_TYPE_STRING = 1; 304 int CELL_TYPE_FORMULA = 2; 305 int CELL_TYPE_BLANK = 3; 306 int CELL_TYPE_BOOLEAN = 4; 307 int CELL_TYPE_ERROR = 5;*/ 308 int type = cell.getCellType(); 309 switch (type) { 310 case 0: 311 Double dValue = (Double) cell.getNumericCellValue(); 312 value = dValue.toString(); 313 break; 314 case 1: 315 value = cell.getStringCellValue(); 316 break; 317 case 3: 318 value = ""; 319 break; 320 } 321 dataMap.put(col, value); 322 col++; 323 } 324 Date date = new Date(); 325 item.setCreatedtime(date); 326 item.setLastmodifiedtime(date); 327 exceldao.importExcel(dynm, dataMap, item, rowXh,mxnm,recordsList,xxls,hzbbStat,dsc,dsr); 328 /*exceldao.importExcel(dynm,value,item);*/ 329 rowXh++; 330 } 331 } 332 } 333 } 334 } 335 } 336 337 //获取报表的对应内码 338 public String getDynm(String bbbh) { 339 String txnm = (String) getParameter("txnm"); 340 return exceldao.getDynm(txnm, bbbh); 341 } 342 public String getMxnm(String dynm) { 343 return exceldao.getMxnm(dynm); 344 } 345 346 //获取报表是否两栏表头 347 public List<String> getIfzh(String dynm){ 348 return exceldao.getIfzh(dynm); 349 } 350 //获取报表一共有几列 351 public int getTableCol(String dynm){ 352 return exceldao.getTableCol(dynm); 353 } 354 355 //根据sheet的组织编号获取组织的内码和名称 356 public String[] getZznmmc(String sheetzzbh) { 357 String txnm = (String) getParameter("sheetzzbh"); 358 return exceldao.getZznmmc(sheetzzbh); 359 } 360 361 //确定报表从第几行开始才是数据行(内容行) 362 public int getRownum(String dynm) { 363 return exceldao.getRownum(dynm); 364 } 365 public DataSet getSjl(String dynm) { 366 return exceldao.getSjl(dynm); 367 } 368 public DataSet getXxl(String dynm) { 369 return exceldao.getXxl(dynm); 370 } 371 public int getXxls(String dynm) { 372 return exceldao.getXxls(dynm); 373 } 374 public int getStat(String dynm,ExcelDr item) { 375 return exceldao.getStat(dynm,item); 376 } 377 378 //确定报表从第几行开始才是数据行(内容行) 379 public int getFooternum(String dynm) { 380 return exceldao.getFooternum(dynm); 381 } 382 public List<HashMap<String, Object>> getRecList(String dynm,String mxnm,ExcelDr item) { 383 return exceldao.getRecList(dynm,mxnm,item); 384 } 385 386 /** 387 * @param 388 * @return void 返回类型 389 * @throws 390 * @Title: getCS 391 * @Description: 获取当前用户所属组织的信息 392 */ 393 public void getCS() { 394 395 String organ_id = GetBspInfo.getBspInfo().getCorporationOrganId();//组织ID 396 397 if (organ_id == null) { 398 setReturn("organ_id", "%"); 399 } else { 400 String organ_name = OrganFactory.getIOrganProvider().getOrganByOrganId(organ_id).getOrganName();//组织姓名 401 setReturn("organ_id", organ_id); 402 } 403 } 404 405 public void getParentOrgans() { 406 String organId = (String) getParameter("organId"); 407 List<String> parentOrgans = new ArrayList<String>(); 408 parentOrgans = exceldao.getParentOrgans(organId); 409 setReturn("organList", parentOrgans); 410 } 411 public void getFaslnm(){ 412 ParameterSet pset = getParameterSet(); 413 String faslnm= exceldao.getFaslnm(pset); 414 setReturn("faslnm", faslnm); 415 } 416 }
这些代码,必须要引入相应jar包才可以。