『壹』 POI读取EXCEL文件的错误(invalidheadersignature)处理
是因为POI(3.0.1版本)还不支持EXCEL4.0以上的版本所造成的,把EXCEL另存为EXCEL3.0或其以下版本就可以解决问题了。这个可以通过VBA来实现,不用手工操作
『贰』 poi导入excel
方法/步骤
一,ExcelUtils工具类(也就是解析EXCEL文件,判断EXCEL的类型以及数据的类型)
importjava.io.IOException;
importjava.io.InputStream;
importjava.math.BigDecimal;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
importorg.apache.poi.hssf.usermodel.HSSFDateUtil;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtils {
privatefinalstaticString excel2003L =“.xls”;// 2003-版本的excel
privatefinalstaticString excel2007U =“.xlsx”;// 2007 +版本的excel
/ **
*描述:获取IO流中的数据,组装成List <List <Object>对象
* @param in,fileName
* @返回
* @throws IOException
* /
publicList <List <Object> getBankListByExcel(InputStream in,String fileName)throwsException {
列表<List <Object> list =null;
//创建的Excel工作薄
Workbook work =this.getWorkbook(in,fileName);
if(null== work){
抛出新的异常(“创建Excel工作薄为空!”);
}
Sheet sheet =null;//页数
行row =null;//行数
Cell cell =null;//列数
list =newArrayList <List <Object >>();
//遍历的Excel中所有的片
for(inti =0; i <work.getNumberOfSheets(); i ++){
sheet = work.getSheetAt(i);
if(sheet ==null){continue;}
//遍历当前片中的所有行
for(intj = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j ++){
row = sheet.getRow(j);
if(row ==null|| row.getFirstCellNum()== j){continue;}
//遍历所有的列
列表<Object> li =newArrayList <Object>();
for(inty = row.getFirstCellNum(); y <row.getLastCellNum(); y ++){
cell = row.getCell(y);
li.add(this.getValue(cell));
}
list.add(LI);
}
}
return 单
}
/ **
*描述:根据文件后缀,自适应上传文件的版本
* @param inStr,fileName
* @返回
* @throws异常
* /
publicWorkbook getWorkbook(InputStream inStr,String fileName)throwsException {
工作簿wb =null;
String fileType = fileName.substring(fileName.lastIndexOf(“。”));
if(excel2003L.equals(fileType)){
wb =newHSSFWorkbook(inStr);// 2003-
}elseif(excel2007U.equals(fileType)){
wb =newXSSFWorkbook(inStr);// 2007 +
}else{
抛出新的异常(“解析的文件格式有误!”);
}
返回wb;
}
/ **
*描述:对表格中数值进行格式化
* @param单元格
* @返回
* /
//解决擅长类型问题,获得数值
publicString getValue(Cell cell){
String value =“”;
if(null== cell){
返回值
}
switch(cell.getCellType()){
//数值型
案例Cell.CELL_TYPE_NUMERIC:
if(HSSFDateUtil.isCellDateFormatted(cell)){
//如果是date类型则,获取该单元格的日期值
Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
SimpleDateFormat format =newSimpleDateFormat(“yyyy-MM-dd”);
value = format.format(date);;
}else{//纯数字
BigDecimal big =newBigDecimal(cell.getNumericCellValue());
value = big.toString();
//解决1234.0去掉后面的.0
if(null!= value &&!“”.equals(value.trim())){
String [] item = value.split(“[。]”);
if(1<item.length &&“0”.equals(item [1])){
value = item [0];
}
}
}
break;
//字符串类型
案例Cell.CELL_TYPE_STRING:
value = cell.getStringCellValue()。toString();
break;
//公式类型
案例Cell.CELL_TYPE_FORMULA:
//读公式计算值
value = String.valueOf(cell.getNumericCellValue());
if(value.equals(“NaN”)){//如果获取的数据值为非法值,则转换为获取字符串
value = cell.getStringCellValue()。toString();
}
break;
//布尔类型
案例Cell.CELL_TYPE_BOOLEAN:
value =“”+ cell.getBooleanCellValue();
break;
默认值:
value = cell.getStringCellValue()。toString();
}
if(“null”.endsWith(value.trim())){
value =“”;
}
返回值
}
}
二,定义两个实体类,一个是对于的Excel文件,解析它的数据(ExcelBean),另一个是导入数据库表的实体类(人)
ExcelBean.java
<strong> <span style =“font-size:18px;”>importorg.apache.poi.xssf.usermodel.XSSFCellStyle;
公共类ExcelBean实现java.io.Serializable {
privateString headTextName;//列头(标题)名
privateString propertyName;//对应字段名
私有整数列;//合并单元格数
私人XSSFCellStyle cellStyle;
publicExcelBean(){
}
publicExcelBean(String headTextName,String propertyName){
这个.headTextName = headTextName;
这个.propertyName = propertyName;
}
publicExcelBean(String headTextName,String propertyName,Integer cols){
super();
这个.headTextName = headTextName;
这个.propertyName = propertyName;
这个.cols = cols;
}
publicString getHeadTextName(){
returnheadTextName;
}
publicvoidsetHeadTextName(String headTextName){
这个.headTextName = headTextName;
}
publicString getPropertyName(){
returnpropertyName;
}
publicvoidsetPropertyName(String propertyName){
这个.propertyName = propertyName;
}
publicInteger getCols(){
返回列;
}
公共无效setCols(Integer cols){
这个.cols = cols;
}
上市XSSFCellStyle getCellStyle(){
返回cellStyle;
}
公共无效setCellStyle(XSSFCellStyle cellStyle){
这个.cellStyle = cellStyle;
}
} </ span> </ strong>
people.java
importjava.util.Date;
公共课人
私有整数id
privateString userName;
私人字符串密码;
私人整数年龄;
私人日期;
publicInteger getId(){
返回id
}
publicvoidsetId(Integer id){
这个.id = id;
}
publicString getUserName(){
returnuserName;
}
publicvoidsetUserName(String userName){
这个.userName = userName ==null?null:userName.trim();
}
publicString getPassword(){
返回密码
}
publicvoidsetPassword(String password){
这个.password = password ==null?null:password.trim();
}
publicInteger getAge(){
回归年龄
}
publicvoidsetAge(Integer age){
这个.age = age
}
publicDate getDate(){
退货日期
}
publicvoidsetDate(Date date){
这个.date = date
}
}
『叁』 poi中怎么读取excel文件
先引入POIjar包(插件)网络现例
『肆』 Java POI读取Excel的时候怎么按列读取
按列读取的方法:String pathname = "E:\\files\\title.xlsx";File file = new File(pathname);InputStream in = new FileInputStream(file);//得到整个excel对象XSSFWorkbook excel = new XSSFWorkbook(in);//获取整个excel有多少个sheetint sheets = excel.getNumberOfSheets();//便利第一个sheetMap<String,String> colMap = new HashMap<String, String>();for(int i = 0 ; i < sheets ; i++ ){XSSFSheet sheet = excel.getSheetAt(i);if(sheet == null){continue;}int mergedRegions = sheet.getNumMergedRegions();XSSFRow row2 = sheet.getRow(0);Map<Integer,String> category = new HashMap<Integer, String>();for(int j = 0 ; j < mergedRegions; j++ ){CellRangeAddress rangeAddress = sheet.getMergedRegion(j);int firstRow = rangeAddress.getFirstColumn();int lastRow = rangeAddress.getLastColumn();category.put(rangeAddress.getFirstColumn(), rangeAddress.getLastColumn()+"-"+row2.getCell(firstRow).toString());}//便利每一行for( int rowNum = 1 ; rowNum <= sheet.getLastRowNum() ; rowNum++ ){System.out.println();XSSFRow row = sheet.getRow(rowNum);if(row == null){continue;}short lastCellNum = row.getLastCellNum();String cate = "";Integer maxIndex = 0;for( int col = row.getFirstCellNum() ; col < lastCellNum ; col++ ){XSSFCell cell = row.getCell(col);if(cell == null ){continue;}if("".equals(cell.toString())){continue;}int columnIndex = cell.getColumnIndex();String string = category.get(columnIndex);if(string != null && !string.equals("")){String[] split = string.split("-");cate = split[1];maxIndex = Integer.parseInt(split[0]);System.out.println(cate+"<–>"+cell.toString());}else {//如果当前便利的列编号小于等于合并单元格的结束,说明分类还是上面的分类名称if(columnIndex<=maxIndex){System.out.println(cate+"<–>"+cell.toString());}else {System.out.println("分类未知"+"<–>"+cell.toString());}}}}}}
『伍』 java使用poi读取excel时,电话号码变成了科学计数法,整数变成double,怎么改过来
为了防止数字变成科学计数法方式表示,在源文件以及java代码中都用文的方式去生成和解析excel,具体如下:
生成Excel时,设置单元格格式为STRING,即:
//关键代码
HSSFCell cell = new HSSFCell();
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
同理,解析的时候,首先要保证源excel文件中该单元格格式是文本类型的,然后在java代码里用STRING类型去解析:
//关键代码
String value = cell.getStringCellValue();
(5)poi读取excel文件扩展阅读;
在这里,将只介绍一些和格式设置有关的语句,假定workbook就是对一个工作簿的引用。在Java中,第一步要做的就是创建和设置字体和单元格的格式,然后再应用这些格式:
创建字体,设置其为红色、粗体:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
『陆』 POI如何读取多重文件夹下的所有excel文档
利用模糊查询,篇读整个磁盘,找到所有XLSX文件,然后记录在数组中,利用循环一个一个读取,不过效率非常低,能力有限,我的思路就这个了,程序编写99%不会这样做,而是相对固定某个文件夹或者某个文件
『柒』 如何用Apache POI读取Excel
首先POI是开源组织Apache出品的一个开源jar包,提供了方便解析Excel的API,我们可以非常方便的使用它来读取Excel。这里介绍3.5Final版本。
所需用到的jar包如下:
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的类来解析,而Excel2007就是使用org.apache.poi.xssf.usermodel来解析。
解析Excel2003源码
说到Excel,有2003和2007,格式是不一样的,用POI解析的方法也就不一样,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的类来解析,而Excel2007就是使用org.apache.poi.xssf.usermodel来解析。
解析Excel2003源码
StringBuffer content = new StringBuffer();HSSFWorkbook workbook = new HSSFWorkbook(is); // 创建对Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {if (null != workbook.getSheetAt(numSheets)) {HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 获得一个sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {if (null != aSheet.getRow(rowNumOfSheet)) {HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 获得一行
for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {if (null != aRow.getCell(cellNumOfRow)) {HSSFCell aCell = aRow.getCell(cellNumOfRow); // 获得列值if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {content.append(aCell.getNumericCellValue() + "");} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {content.append(aCell.getBooleanCellValue() + "");} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {content.append(aCell.getStringCellValue() + "");} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){content.append(aCell.getCellFormula() + "");} else {continue;}}if(cellNumOfRow == aRow.getLastCellNum()) {content.append("");}}}}}}
return content.toString().trim();
解析Excel2007和2003基本一样,只是将HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。
另外要提醒大家的是Excel的样式都是基于一个单元格的,所以用HSSFRow.getRowStyle()拿样式会出问题的,不一定会拿到你想要的样式。处理合并单元格是POI的一个难点,只能通过判断当前单元格是否在合并单元格之中,如果是,那此单元格的值便是这个合并单元格的首位置单元格的值,只有通过这样才能来处理合并单元格。
处理合并单元格的代码:
public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {//得到一个sheet中有多少个合并单元格int sheetmergerCount = sheet.getNumMergedRegions();for(int i = 0; i < sheetmergerCount; i++) {//得出具体的合并单元格CellRangeAddress ca = sheet.getMergedRegion(i);//得到合并单元格的起始行, 结束行, 起始列, 结束列int firstC = ca.getFirstColumn();int lastC = ca.getLastColumn();int firstR = ca.getFirstRow();int lastR = ca.getLastRow();//判断该单元格是否在合并单元格范围之内, 如果是, 则返回 trueif(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {return true;}}}return false;}
public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {//获得一个 sheet 中合并单元格的数量int sheetmergerCount = sheet.getNumMergedRegions();//便利合并单元格for(int i = 0; i < sheetmergerCount; i++) {//获得合并单元格CellRangeAddress ca = sheet.getMergedRegion(i);//获得合并单元格的起始行, 结束行, 起始列, 结束列int firstC = ca.getFirstColumn();int lastC = ca.getLastColumn();int firstR = ca.getFirstRow();int lastR = ca.getLastRow();//判断该单元格是否是在合并单元格中, 如果是, 则返回所在合并单元格的首单元格的值if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {HSSFRow fRow = sheet.getRow(firstR);HSSFCell fCell = fRow.getCell(firstC);//除了合并单元格首单元格的值, 其余的用(*)来区分if (fCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC && hasBorder(cell)) {return String.valueOf(fCell.getNumericCellValue());} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN && hasBorder(cell)) {return String.valueOf(fCell.getBooleanCellValue());} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_STRING && hasBorder(cell)) {return fCell.getStringCellValue();} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA && hasBorder(cell)){return String.valueOf(fCell.getCellFormula());}}}}return "";}
『捌』 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();}}}
『玖』 POI 读取excel
直接上源码:package e.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/*** 操作Excel表格的功能类*/public class ExcelReader {private POIFSFileSystem fs;private HSSFWorkbook wb;private HSSFSheet sheet;private HSSFRow row;/*** 读取Excel表格表头的内容* @param InputStream* @return String 表头内容的数组*/public String[] readExcelTitle(InputStream is) {try {fs = new POIFSFileSystem(is);wb = new HSSFWorkbook(fs);} catch (IOException e) {e.printStackTrace();}sheet = wb.getSheetAt(0);row = sheet.getRow(0);// 标题总列数int colNum = row.getPhysicalNumberOfCells();System.out.println("colNum:" + colNum);String[] title = new String[colNum];for (int i = 0; i < colNum; i++) {//title[i] = getStringCellValue(row.getCell((short) i));title[i] = getCellFormatValue(row.getCell((short) i));}return title;}/*** 读取Excel数据内容* @param InputStream* @return Map 包含单元格数据内容的Map对象*/public Map<Integer, String> readExcelContent(InputStream is) {Map<Integer, String> content = new HashMap<Integer, String>();String str = "";try {fs = new POIFSFileSystem(is);wb = new HSSFWorkbook(fs);} catch (IOException e) {e.printStackTrace();}sheet = wb.getSheetAt(0);// 得到总行数int rowNum = sheet.getLastRowNum();row = sheet.getRow(0);int colNum = row.getPhysicalNumberOfCells();// 正文内容应该从第二行开始,第一行为表头的标题for (int i = 1; i <= rowNum; i++) {row = sheet.getRow(i);int j = 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 = "";}return content;}/*** 获取单元格数据内容为字符串类型的数据** @param cell Excel单元格* @return String 单元格数据内容*/private String getStringCellValue(HSSFCell cell) {String strCell = "";switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:strCell = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_NUMERIC:strCell = String.valueOf(cell.getNumericCellValue());break;case HSSFCell.CELL_TYPE_BOOLEAN:strCell = String.valueOf(cell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_BLANK:strCell = "";break;default:strCell = "";break;}if (strCell.equals("") || strCell == null) {return "";}if (cell == null) {return "";}return strCell;}/*** 获取单元格数据内容为日期类型的数据** @param cell* Excel单元格* @return String 单元格数据内容*/private String getDateCellValue(HSSFCell cell) {String result = "";try {int cellType = cell.getCellType();if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {Date date = cell.getDateCellValue();result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)+ "-" + date.getDate();} else if (cellType == HSSFCell.CELL_TYPE_STRING) {String date = getStringCellValue(cell);result = date.replaceAll("[年月]", "-").replace("日", "").trim();} else if (cellType == HSSFCell.CELL_TYPE_BLANK) {result = "";}} catch (Exception e) {System.out.println("日期格式不正确!");e.printStackTrace();}return result;}/*** 根据HSSFCell类型设置数据* @param cell* @return*/private String getCellFormatValue(HSSFCell cell) {String cellvalue = "";if (cell != null) {// 判断当前Cell的Typeswitch (cell.getCellType()) {// 如果当前Cell的Type为NUMERICcase HSSFCell.CELL_TYPE_NUMERIC:case HSSFCell.CELL_TYPE_FORMULA: {// 判断当前的cell是否为Dateif (HSSFDateUtil.isCellDateFormatted(cell)) {// 如果是Date类型则,转化为Data格式//方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00//cellvalue = cell.getDateCellValue().toLocaleString();//方法2:这样子的data格式是不带带时分秒的:2011-10-12Date date = cell.getDateCellValue();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");cellvalue = sdf.format(date);}// 如果是纯数字else {// 取得当前Cell的数值cellvalue = String.valueOf(cell.getNumericCellValue());}break;}// 如果当前Cell的Type为STRINcase HSSFCell.CELL_TYPE_STRING:// 取得当前的Cell字符串cellvalue = cell.getRichStringCellValue().getString();break;// 默认的Cell值default:cellvalue = " ";}} else {cellvalue = "";}return cellvalue;}public static void main(String[] args) {try {// 对读取Excel表格标题测试InputStream is = new FileInputStream("d:\\test2.xls");ExcelReader excelReader = new ExcelReader();String[] title = excelReader.readExcelTitle(is);System.out.println("获得Excel表格的标题:");for (String s : title) {System.out.print(s + " ");}// 对读取Excel表格内容测试InputStream is2 = new FileInputStream("d:\\test2.xls");Map<Integer, String> map = excelReader.readExcelContent(is2);System.out.println("获得Excel表格的内容:");for (int i = 1; i <= map.size(); i++) {System.out.println(map.get(i));}} catch (FileNotFoundException e) {System.out.println("未找到指定路径的文件!");e.printStackTrace();}}}
『拾』 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文件|poi导入excel