1. 请教POI解析xlsx时报错
POI读取Excel有两种模式,一种是用户模式,一种是SAX模式,将xlsx格式的文档转换成CVS格式后再进行处理用户模式相信大家都很清楚,也是POI常用的方式,用户模式API接口丰富,我们可以很容易的使用POI的API读取Excel,但用户模式消耗的内存很大,当遇到很多sheet、大数据网格、假空行、公式等问题时,很容易导致内存溢出。POI官方推荐解决内存溢出的方式使用CVS格式解析,我们不可能手工将Excel文件转换成CVS格式再上传,这样做太麻烦了,好再POI给出了xlsx转换CVS的例子,基于这个例子我进行了一下改造,即可解决用户模式读取Excel内存溢出的问题。下面附上代码
2. 要用java POI读取Excel文件中的数据,并且实现对数据的格式校验,输入错误信息
太笼统了,只能给出一个POI读取Excel的大致方法。对数据的校验,与具体的文件有关。你定义的那一列是时间类型的,那一列是数字列的。盲目的读取,无法判断数据的类型。
3. java poi怎么获取excel单元格的内容
packagee.sjtu.erplab.poi;importjava.io.InputStream&ch=ww.xqy.chain"target="_blank"class="link-ke">FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importorg.apache.poi.hssf.usermodel.HSSFCell;importorg.apache.poi.hssf.usermodel.HSSFDateUtil;importorg.apache.poi.hssf.usermodel.HSSFRow;importorg.apache.poi.hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.poifs.filesystem.POIFSFileSystem;/***操作Excel表格的功能类*/publicclassExcelReader{privatePOIFSFileSystemfs;privateHSSFWorkbookwb;privateHSSFSheetsheet;privateHSSFRowrow;/***读取Excel表格表头的内容*@paramInputStream*@returnString表头内容的数组*/publicString[]readExcelTitle(InputStreamis){try{fs=newPOIFSFileSystem(is);wb=newHSSFWorkbook(fs);}catch(IOExceptione){e.printStackTrace();}sheet=wb.getSheetAt(0);row=sheet.getRow(0);//标题总列数intcolNum=row.getPhysicalNumberOfCells();System.out.println("colNum:"+colNum);String[]title=newString[colNum];for(inti=0;i<colNum;i++){//title[i]=getStringCellValue(row.getCell((short)i));title[i]=getCellFormatValue(row.getCell((short)i));}returntitle;}/***读取Excel数据内容*@paramInputStream*@returnMap包含单元格数据内容的Map对象*/publicMap<Integer,String>readExcelContent(InputStreamis){Map<Integer,String>content=newHashMap<Integer,String>();Stringstr="";try{fs=newPOIFSFileSystem(is);wb=newHSSFWorkbook(fs);}catch(IOExceptione){e.printStackTrace();}sheet=wb.getSheetAt(0);//得到总行数introwNum=sheet.getLastRowNum();row=sheet.getRow(0);intcolNum=row.getPhysicalNumberOfCells();//正文内容应该从第二行开始,第一行为表头的标题for(inti=1;i<=rowNum;i++){row=sheet.getRow(i);intj=0;while(j<colNum){//每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据//也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean//str+=getStringCellValue(row.getCell((short)j)).trim()+//"-";str+=getCellFormatValue(row.getCell((short)j)).trim()+"";j++;}content.put(i,str);str="";}returncontent;}/***获取单元格数据内容为字符串类型的数据**@paramcellExcel单元格*@returnString单元格数据内容*/(HSSFCellcell){StringstrCell="";switch(cell.getCellType()){caseHSSFCell.CELL_TYPE_STRING:strCell=cell.getStringCellValue();break;caseHSSFCell.CELL_TYPE_NUMERIC:strCell=String.valueOf(cell.getNumericCellValue());break;caseHSSFCell.CELL_TYPE_BOOLEAN:strCell=String.valueOf(cell.getBooleanCellValue());break;caseHSSFCell.CELL_TYPE_BLANK:strCell="";break;default:strCell="";break;}if(strCell.equals("")||strCell==null){return"";}if(cell==null){return"";}returnstrCell;}/***获取单元格数据内容为日期类型的数据**@paramcell*Excel单元格*@returnString单元格数据内容*/privateStringgetDateCellValue(HSSFCellcell){Stringresult="";try{intcellType=cell.getCellType();if(cellType==HSSFCell.CELL_TYPE_NUMERIC){Datedate=cell.getDateCellValue();result=(date.getYear()+1900)+"-"+(date.getMonth()+1)+"-"+date.getDate();}elseif(cellType==HSSFCell.CELL_TYPE_STRING){Stringdate=getStringCellValue(cell);result=date.replaceAll("[年月]","-").replace("日","").trim();}elseif(cellType==HSSFCell.CELL_TYPE_BLANK){result="";}}catch(Exceptione){System.out.println("日期格式不正确!");e.printStackTrace();}returnresult;}/***根据HSSFCell类型设置数据*@paramcell*@return*/(HSSFCellcell){Stringcellvalue="";if(cell!=null){//判断当前Cell的Typeswitch(cell.getCellType()){//如果当前Cell的Type为NUMERICcaseHSSFCell.CELL_TYPE_NUMERIC:caseHSSFCell.CELL_TYPE_FORMULA:{//判断当前的cell是否为Dateif(HSSFDateUtil.isCellDateFormatted(cell)){//如果是Date类型则,转化为Data格式//方法1:这样子的data格式是带时分秒的:2011-10-120:00:00//cellvalue=cell.getDateCellValue().toLocaleString();//方法2:这样子的data格式是不带带时分秒的:2011-10-12Datedate=cell.getDateCellValue();SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");cellvalue=sdf.format(date);}//如果是纯数字else{//取得当前Cell的数值cellvalue=String.valueOf(cell.getNumericCellValue());}break;}//如果当前Cell的Type为STRINcaseHSSFCell.CELL_TYPE_STRING://取得当前的Cell字符串cellvalue=cell.getRichStringCellValue().getString();break;//默认的Cell值default:cellvalue="";}}else{cellvalue="";}returncellvalue;}publicstaticvoidmain(String[]args){try{//对读取Excel表格标题测试InputStreamis=newFileInputStream("d:\test2.xls");ExcelReaderexcelReader=newExcelReader();String[]title=excelReader.readExcelTitle(is);System.out.println("获得Excel表格的标题:");for(Strings:title){System.out.print(s+"");}//对读取Excel表格内容测试InputStreamis2=newFileInputStream("d:\test2.xls");Map<Integer,String>map=excelReader.readExcelContent(is2);System.out.println("获得Excel表格的内容:");for(inti=1;i<=map.size();i++){System.out.println(map.get(i));}}catch(FileNotFoundExceptione){System.out.println("未找到指定路径的文件!");e.printStackTrace();}}}
4. java poi 读取excel 数字类型的怎么读到以后1都变成了1.0
这是正常的。通过POI取出的数值默认都是double,即使excel单元格中存的是1,取出来的值也是1.0,这就造成了一些问题,如果数据库字段是int,那么就会wrongdatatype,所以需要对数值类型处理。代码如下:Cellcell=null;//单元格ObjectinputValue=null;//单元格值if(!isEmpty(cell)&&cell.getCellType()==Cell.CELL_TYPE_NUMERIC){longlongVal=Math.round(cell.getNumericCellValue());if(Double.parseDouble(longVal+".0")==doubleVal)inputValue=longVal;elseinputValue=doubleVal;}这么处理后,单元格中的小数没有变化,如果是整数,也会取到整数。
5. poi读取excel文件内容
//参数分别是开始行,结束行,行对应的开始列和结束列 public void getExcelElement(int startRow,int endRow,int startCell,int endCell){ XSSFWorkbook wb=new XSSFWorkbook(); XSSFSheet sheet=wb.getSheet("sheetName"); for(int i=startRow;i<=endRow;i++){ XSSFRow row=sheet.getRow(i); for(int a=startCell;a<=endCell;a++){ XSSFCell cell=row.getCell(a); System.out.println(cell); } } }
我没跑过你先试试有问题再说
6. java poi 读取excel 数字类型
那就用try catch吧try里转化成整形,catch里转成浮点型
7. Poi如何去读取excel文件
直接全部在action里面写的,这个就不多说了,直接上代码:public String executeExcel() throws Exception{ String realPath = ServletActionContext.getServletContext().getRealPath("/fileupload"); System.out.println(fileFileName); String filePath = ""; if(this.file!=null){ File saveFile = new File(new File(realPath),this.fileFileName); filePath = realPath+"\\"+this.fileFileName; System.out.println(filePath); if(!saveFile.getParentFile().exists()){ saveFile.getParentFile().mkdirs(); } FileUtils.File(file, saveFile); } this.exlToDB(filePath); ActionContext.getContext().put("message","导入成功"); return "success"; } //读取excel2007,并把数据插入数据库 public void exlToDB(String filePath){ boolean flag = true; AllKpi akpi = new AllKpi(); try { // 文件流指向excel文件 FileInputStream fin=new FileInputStream(filePath); XSSFWorkbook workbook = new XSSFWorkbook(fin);// 创建工作薄 XSSFSheet sheet = workbook.getSheetAt(0);// 得到工作表 XSSFRow row = null;// 对应excel的行 XSSFCell cell = null;// 对应excel的列 int totalRow = sheet.getLastRowNum();// 得到excel的总记录条数 System.out.println(totalRow); // 以下的字段一一对应数据库表的字段 float idd = 0.0f; String id = ""; String Name = ""; String DEPT_NAME = ""; String Weight = ""; <span></span>String ALGORITHM = ""; String text = " "; //String sql = "insert into DSP_TJ_KPI values(DSP_TJ_KPI_SEQ.nextval,?,?,?,'无',?)"; for (int i = 1; i <= totalRow; i++) { row = sheet.getRow(i); //System.out.println(row.getCell(0).toString()); if(row.getCell(0) != null && !"".equals(row.getCell(0)) && row.getCell(1) != null && !"".equals(row.getCell(1)) && row.getCell(2) != null && !"".equals(row.getCell(2)) && row.getCell(3) != null && !"".equals(row.getCell(3))){ cell = row.getCell((short) 0); Name = cell.toString(); System.out.println(Name); cell = row.getCell((short) 1); Weight = cell.toString(); System.out.println(Weight); cell = row.getCell((short) 2); DEPT_NAME = cell.toString(); System.out.println(DEPT_NAME); cell = row.getCell((short) 3); ALGORITHM = cell.toString(); System.out.println(ALGORITHM); akpi.setAllkpiName(Name); akpi.setAllkpiDeptName(DEPT_NAME); akpi.setAllkpiWeight(Weight); akpi.setAlgorithm(ALGORITHM); akpi.setText(text); allKpiService.addAllKpi(akpi); //以下注释代码为连接jdbc测试代码块 /*pst = con.prepareStatement(sql); //pst.setString(1, student_id); pst.setString(1, DEPT_NAME); pst.setString(2, Name); pst.setString(3, Weight); <span></span>pst.setString(4, ALGORITHM); pst.execute();*/ System.out.println("preparestatement successful"); } } /*pst.close(); con.close();*/ fin.close(); } catch (FileNotFoundException e) { flag = false; e.printStackTrace(); } catch (IOException ex) { flag = false; ex.printStackTrace(); }
未经允许不得转载:山九号 » POI读取Excel文件类型|要用Java POI读取Excel文件中的数据并且实现对数据的格式校验输入错误信息