精华内容
下载资源
问答
  • Selenium做自动化测试当然不能避免和Excel打交道。... Workbook workBook = WorkbookFactory.create(inStream); 后续可以直接操作sheet,Row,Cell,也不用管文件类型。 目前还没有发现这种方法的缺点。

    Selenium做自动化测试当然不能避免和Excel打交道。

    由于Excel版本的关系,文件扩展名分xls和xlsx,

    以往的经验都是使用HSSFWorkbook和XSSFWorkbook来分别处理。具体的方式就是先判断文件的类型,然后根据文件扩展名来选择方法。

    大概处理方式如下:

    String extention= getExtention(path);

    if (!EMPTY.equals(extention)) {

    if (XLS.equals(extention)) {

    return readXlsForAllSheets(path);

    } else if (XLSX.equals(extention)) {

    return readXlsxForAllSheets(path);

    }

    } else {

    System.out.println(path + " is not a excel file.");

    }

    再接着实现readXlsForAllSheets和readXlsxForAllSheets两个方法。

    public Object[][] readXlsxForAllSheets(String path) throws IOException{

    System.out.println(path);

    FileInputStream is = new FileInputStream(path);

    XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);

    System.out.println("There are totally "+xssfWorkbook.getNumberOfSheets()+" sheets in the workbook.");

    // Read the Sheet

    List records1=new ArrayList();

    for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {

    XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);

    int rowCount=xssfSheet.getLastRowNum()-xssfSheet.getFirstRowNum();

    List records=new ArrayList();

    String[] separative={"This is sheet "+xssfWorkbook.getSheetName(numSheet)};

    records.add(separative);

    for(int rowNum =1;rowNum

    XSSFRow xssfRow=xssfSheet.getRow(rowNum);

    String fields[]=new String[xssfRow.getLastCellNum()];

    for (int colNum=0;colNum

    XSSFCell xssfCell=xssfRow.getCell(colNum);

    fields[colNum]=this.getXssfCellValue(xssfCell);

    }

    records.add(fields);

    }

    records1.addAll(records);

    }

    Object[][] results=new Object[records1.size()][];

    for(int i=0;i

    results[i]=records1.get(i);

    }

    if (xssfWorkbook!=null){xssfWorkbook.close();}

    return results;

    }

    public Object[][] readXlsForAllSheets(String path) throws IOException{

    System.out.println(PROCESSING + path);

    FileInputStream is = new FileInputStream(path);

    HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);

    System.out.println("There are totally "+hssfWorkbook.getNumberOfSheets()+" sheets in the workbook.");

    // Read the Sheet

    List records1=new ArrayList();

    for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {

    HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);

    int rowCount=hssfSheet.getLastRowNum()-hssfSheet.getFirstRowNum();

    List records=new ArrayList();

    String[] separative={"This is sheet "+hssfWorkbook.getSheetName(numSheet)};

    records.add(separative);

    for(int rowNum =1;rowNum

    HSSFRow xssfRow=hssfSheet.getRow(rowNum);

    String fields[]=new String[xssfRow.getLastCellNum()];

    for (int colNum=0;colNum

    HSSFCell xssfCell=xssfRow.getCell(colNum);

    fields[colNum]=this.getHssfCellValue(xssfCell);

    }

    records.add(fields);

    }

    records1.addAll(records);

    }

    Object[][] results=new Object[records1.size()][];

    for(int i=0;i

    results[i]=records1.get(i);

    }

    if (hssfWorkbook!=null){hssfWorkbook.close();}

    return results;

    }

    再实现上两个方法中调用的getXssfCellValue和getHssfCellValue方法。

    private String getXssfCellValue(XSSFCell xssfCell) {

    String cellvalue="";

    DataFormatter formatter = new DataFormatter();

    if (null != xssfCell) {

    switch (xssfCell.getCellType()) {

    case XSSFCell.CELL_TYPE_NUMERIC: // 数字

    if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(xssfCell)) {

    cellvalue = formatter.formatCellValue(xssfCell);

    } else {

    double value = xssfCell.getNumericCellValue();

    int intValue = (int) value;

    cellvalue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);

    }

    break;

    case XSSFCell.CELL_TYPE_STRING: // 字符串

    cellvalue=xssfCell.getStringCellValue();

    break;

    case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean

    cellvalue=String.valueOf(xssfCell.getBooleanCellValue());

    break;

    case XSSFCell.CELL_TYPE_FORMULA: // 公式

    cellvalue=String.valueOf(xssfCell.getCellFormula());

    break;

    case XSSFCell.CELL_TYPE_BLANK: // 空值

    cellvalue="";

    break;

    case XSSFCell.CELL_TYPE_ERROR: // 故障

    cellvalue="";

    break;

    default:

    cellvalue="UNKNOWN TYPE";

    break;

    }

    } else {

    System.out.print("-");

    }

    return cellvalue.trim();

    }

    private String getHssfCellValue(HSSFCell hssfCell) {

    String cellvalue="";

    DataFormatter formatter = new DataFormatter();

    if (null != hssfCell) {

    switch (hssfCell.getCellType()) {

    case HSSFCell.CELL_TYPE_NUMERIC: // 数字

    if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(hssfCell)) {

    cellvalue = formatter.formatCellValue(hssfCell);

    } else {

    double value = hssfCell.getNumericCellValue();

    int intValue = (int) value;

    cellvalue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);

    }

    break;

    case HSSFCell.CELL_TYPE_STRING: // 字符串

    cellvalue=hssfCell.getStringCellValue();

    break;

    case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean

    cellvalue=String.valueOf(hssfCell.getBooleanCellValue());

    break;

    case HSSFCell.CELL_TYPE_FORMULA: // 公式

    cellvalue=String.valueOf(hssfCell.getCellFormula());

    break;

    case HSSFCell.CELL_TYPE_BLANK: // 空值

    cellvalue="";

    break;

    case HSSFCell.CELL_TYPE_ERROR: // 故障

    cellvalue="";

    break;

    default:

    cellvalue="UNKNOWN TYPE";

    break;

    }

    } else {

    System.out.print("-");

    }

    return cellvalue.trim();

    }

    最终整个解析Excel文件的功能才算完成,我们需要实现4个方法readXlsForAllSheets和readXlsxForAllSheets,getXssfCellValue和getHssfCellValue,那么有没有更加简单实用的方法呢?

    下面要介绍的是POI jar包提供的WorkbookFactory类。需要加载poi-ooxm-3.15.jar到build path。

    01b9de01071723b28d6156c93e8a000c.png

    只需要两行就可以实例化workbook,而不用管它是xls还是xlsx。

    inStream = new FileInputStream(new File(filePath));

    Workbook workBook = WorkbookFactory.create(inStream);

    后续可以直接操作sheet,Row,Cell,也不用管文件类型。

    目前还没有发现这种方法的缺点。

    展开全文
  • Excel 类WorkbookFactory

    2020-07-06 09:33:42
    Workbook wb = WorkbookFactory.create(new FileInputStream(file)); //刷新excel公式(否则公式不会重新计算) wb.setForceFormulaRecalculation(true); wb.write(new FileOutputStream(newFileName)); ...
    File file = new File(newFileName);
            Workbook wb = WorkbookFactory.create(new FileInputStream(file));
            //刷新excel公式(否则公式不会重新计算)
            wb.setForceFormulaRecalculation(true);
            wb.write(new FileOutputStream(newFileName));
    
    展开全文
  • import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import com.alibaba.fastjson.JSON; public class ...

    假如我们现在要用java读取这样一个excel:

    直接上代码:

    package com.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.poi.ss.usermodel.DataFormatter;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import com.alibaba.fastjson.JSON;
    
    public class ExcelReadUtil {
        private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExcelReadUtil.class);
    
        /**
         * 读取excel文件流
         * @param in
         * @return
         */
        public static List<Map<String, String>>  readExcel(FileInputStream in) {
            List<Map<String, String>> list = new ArrayList<Map<String, String>>();
            Map<String, String> map = null;
            Workbook workbook = null;
            try {
                workbook = WorkbookFactory.create(in);
                Sheet sheet = workbook.getSheetAt(0);  //示意访问sheet
                int rows = sheet.getPhysicalNumberOfRows();
                for (int i = 1; i < rows; i++) {
                    map = new HashMap<String, String>();
                    // 获取第i行数据
                    XSSFRow sheetRow = (XSSFRow)sheet.getRow(i);
                    // 组织数据
                    map.put("REAL_NAME",getXssfCellValue(sheetRow.getCell(0)));// 姓名
                    map.put("SEX", getXssfCellValue(sheetRow.getCell(1)));// 性别
                    map.put("NATION", getXssfCellValue(sheetRow.getCell(2)));// 民族
                    map.put("CARD_TYPE", getXssfCellValue(sheetRow.getCell(3)));// 身份证件种类
                    map.put("CARD_NO", getXssfCellValue(sheetRow.getCell(4)));// 身份证件号码
                    map.put("EDUCATION", getXssfCellValue(sheetRow.getCell(5)));// 文化程度
                    map.put("POLICY_STATUS", getXssfCellValue(sheetRow.getCell(6)));// 政治面貌
                    map.put("BIRTH", getXssfCellValue(sheetRow.getCell(7)));// 出生年月
                    map.put("MOBILE_PHONE", getXssfCellValue(sheetRow.getCell(8)));// 移动电话
                    map.put("JOB_NUMBER", getXssfCellValue(sheetRow.getCell(9)));// 公司工号
                    map.put("AUTHENTICA_NO", getXssfCellValue(sheetRow.getCell(10)));// 资格证书编号
                    System.out.println("开始读取第"+i+"行数据:"+JSON.toJSONString(map));
                    list.add(map);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                if(workbook!=null) {
                    try {
                        workbook.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(in!=null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            
            }
            return list;
        }
        private static String getXssfCellValue(XSSFCell xssfCell) {
            String cellvalue="";
            DataFormatter formatter = new DataFormatter();
            if (null != xssfCell) {  
                switch (xssfCell.getCellType()) {  
                case XSSFCell.CELL_TYPE_NUMERIC: // 数字  
                    double value = xssfCell.getNumericCellValue();
                    DecimalFormat df = new DecimalFormat("0");
                    cellvalue = df.format(value);
                   // int intValue = (int) value;
                    //cellvalue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
                    break;
                case XSSFCell.CELL_TYPE_STRING: // 字符串  
                    cellvalue=xssfCell.getStringCellValue();
                    break;  
                case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean  
                    cellvalue=String.valueOf(xssfCell.getBooleanCellValue());
                    break;  
                case XSSFCell.CELL_TYPE_FORMULA: // 公式  
                    cellvalue=String.valueOf(xssfCell.getCellFormula());  
                    break;  
                case XSSFCell.CELL_TYPE_BLANK: // 空值  
                    cellvalue="";  
                    break;  
                case XSSFCell.CELL_TYPE_ERROR: // 故障  
                    cellvalue="";  
                    break;  
                default:  
                    cellvalue="UNKNOWN TYPE";  
                    break;  
                }  
            } else {  
                System.out.print("-");  
            }
            return cellvalue.trim();
        }
    
        //测试demo
        public static void main(String[] args) throws IOException {
    
            File xlsFile = new File("C:\\Users\\Administrator\\Desktop\\测试.xlsx");
            FileInputStream fileInputStream = new FileInputStream(xlsFile);
            // 获得工作簿内容
            List<Map<String,String>> readExcel = ExcelReadUtil.readExcel(fileInputStream);
            //打印
            System.out.println(JSON.toJSONString(readExcel));
        }
    
    }

    excel 测试文件已上传,在我的上传资源里,需要的自己下载,也可以按照我的截图自己弄一个

    感谢!!!

    展开全文
  • try { ***myWorkBook = WorkbookFactory.create(inputStream);*** } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } int totalSheets = myWorkBook.getNumberOfSheets(); 我的...

    这是我用xlsx和xls格式读取文件的代码

    File customerTemplateFileObj = new File(customerTemplateFullPath);

    InputStream inputStream = new FileInputStream(customerTemplateFileObj);

    Workbook myWorkBook = null;

    try {

    ***myWorkBook = WorkbookFactory.create(inputStream);***

    }

    catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    int totalSheets = myWorkBook.getNumberOfSheets();

    我的代码适用于xls格式,但对于xlsx,它停在

    myWorkBook = WorkbookFactory.create(inputStream);

    没有任何例外.

    最佳答案 在java中读取xlsx文件extion使用poi jar中的XSSFWorkbook类

    package com.ssaurel.samples.excel;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.IOException;

    import java.util.Iterator;

    import org.apache.poi.ss.usermodel.Cell;

    import org.apache.poi.ss.usermodel.Row;

    import org.apache.poi.xssf.usermodel.XSSFSheet;

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class ReadExcel {

    public static void main(String[] args) throws IOException {

    File excelFile = new File("contacts.xlsx");

    FileInputStream fis = new FileInputStream(excelFile);

    // we create an XSSF Workbook object for our XLSX Excel File

    XSSFWorkbook workbook = new XSSFWorkbook(fis);

    // ...

    }

    }

    展开全文
  • 在使用xlsx格式的时候报的乱码和name is too long,但是xls格式却可以正常使用,不知道什么原因导致的,希望有大佬来指导下。如果解决了问题也会第一时间在这里贴出来。
  • WorkbookFactory.create方法可以读取XLS和XLSX文件,而不用担心版本问题。 使用读取文件方式创建Workbook发现读取速度非常慢,内存占用小 WorkbookFactory.create(File) 使用读取流方式创建Workbook读取速度快,...
  • //我用的最新的2.2.1版本 //第一步:引用DLL,5个全导入,包括ICSHARP.ZIP,是个开源压缩工具包。...//第三部:用IWorkbook 接口,+WorkbookFactory类 //第四步:读取xlsx文件内容 StringBuilder sb = ...
  • 于是在断点的情况下,博主确认controller能接收MultipartFile文件并能转换成inputstream流,但是在inputstream使用poi包下的WorkbookFactory转换时会报错。 java.lang.NoClassDefFoundError: org/...
  • 其中:  a)Workbook、Sheet、Row、Cell等为接口;  b)HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell为97-2003版本对应的处理实现类;  c)XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell为2007+版本对应的处理...
  • WorkbookFactory.create(InputStream)的使用

    万次阅读 2019-05-24 14:28:51
    因为excel格式有两种,一种就是xls,一种就是xlsx,如果我们需要解析excel,以前的方法是 String fileName = file.getOriginalFilename(); 先获取文件名,然后在判断他是什么...现在有了WorkbookFactory.create(InputS...
  • Workbook wb = WorkbookFactory.create(file);解析: 因为excel格式有两种,一种就是xls,一种就是xlsx,如果我们需要解析excel,以前的方法是 String fileName = file.getOriginalFilename(); 先获取文件名,然后在...
  • result = {NoSuchFieldError@14931} Method threw 'java.lang.NoSuchFieldError' exception. detailMessage = "RETURN_NULL_AND_BLANK" cause = {NoSuchFieldError@14931} "java.lang.NoSuchFieldError: RETURN_NU.....
  • 从这篇文章找到了原因:https://www.cnblogs.com/likui-bookHouse/articles/7490151.html
  • 原因: jdk版本太低,不支持这个jdk1.8编译过的项目运行 使用poi4.1的jar包是不支持JDK1.7的,最低JDK1.8 解决: 1:下载低版本的poi包,3.1.0等 2:使用 JDK1.8 ...
  • 5w条数据,执行创建,需要4分钟 ,有人做过优化吗,可以提一点建议???
  • Workbook workbook = WorkbookFactory.create(new FileInputStream(filename)) WorkbookFactory.create()这个方法是干什么的? 得到的Workbook workbook是个什么?
  • POI用于JavaWeb中,使用java工程执行没有问题,正常导入。使用javaWeb就报错。 百度之后,发现可能是哪里冲突了。于是查看引入包,发现POI有3.8版本和3.10版本都引入了。删除3.8的三个引入包,问题依然存在。...
  • POI中找不到WorkbookFactory

    万次阅读 2016-09-11 15:50:17
    POI中找不到WorkbookFactory类问题在使用poi-3.15-beta2版本解析excel时, 发现并有网友所说的WorkbookFactory类.原因从poi-3.7.jar开始, WorkbookFactory类已经放进poi-ooxml-XXX.jar中了.解决方法同时引入这两个jar...
  • Workbook workbook = WorkbookFactory.create(is); 下载了新版本的poi包poi-3.9 发现找不到WorkbookFactory这个类 最后发现这个类存在于:poi-ooxml-3.9.jar中 所以以后再做的这个操作时要下下载两个包: poi...
  • WorkbookFactory 找不到

    2013-11-08 10:46:53
    在最近的POI版本中,poi-3.9.jar包中找不到WorkbookFactory这个类,该类在创建一个存在的Excel文件并读取内容时会用到,而这个类存在于:poi-ooxml-3.9.jar中,因此如果在apapche网站下载poi包时,需要引入这两个jar...
  • WorkbookFactory所在jar包

    2016-02-22 10:04:33
    excel POI compile("org.apache.poi:poi:3.13") 中没有 WorkbookFactory  在 compile("org.apache.poi:poi-ooxml:3.13") 中
  • poi WorkbookFactory 找不到类问题

    万次阅读 2011-09-08 13:17:03
    在最近的POI版本中,poi-3.7.jar包中找不到WorkbookFactory这个类,该类在创建一个存在的Excel文件并读取内容时会用到,而这个类存在于:poi-ooxml-3.7.jar中,因此如果在apapche网站下载poi包时,需要引入这两个jar...
  • 【POI】 WorkbookFactory类找不到

    千次阅读 2012-03-23 14:21:50
    在最近的POI版本中,poi-3.7.jar包中找不到WorkbookFactory这个类,该类在创建一个存在的Excel文件并读取内容时会用到,而这个类存在于:poi-ooxml-3.7.jar中,因此如果在apapche网站下载poi包时,需要引入这两个jar...
  • WorkbookFactory无法使用,在jar包里面,WorkbookFactory.class为空,请问该怎么处理 其余类都可以正常使用 [img=https://img-bbs.csdn.net/upload/202105/14/1620974757_42487.jpg][/img][img=...
  • the guide are saying to close workbook when done."Workbook should be closed after use"but i dont have a close method to close it.how could it be ...Workbook wb = WorkbookFactory.create(tempFile);...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,419
精华内容 1,367
关键字:

workbookfactory