精华内容
下载资源
问答
  • 复杂excel的解析
    2021-04-17 07:19:50

    /**

    * 解析excel

    * @param file

    * @return

    * @throws Exception

    *

    * @author : weihui

    * @createTime : 2016年1月17日 下午3:48:50

    */

    public static List> parseXls(File file) throws Exception {

    InputStream is = new FileInputStream(file);

    //读取表格

    Workbook wb = WorkbookFactory.create(is);

    Sheet sheet = wb.getSheetAt(0);

    List> rows = new ArrayList>();

    for(Row r : sheet){

    if(r.getRowNum() == 0) continue; //meta数据忽略

    List columns = new ArrayList();

    for(Cell c : r){

    columns.add(getCellValue(c));

    /*if(c.getColumnIndex() == 0){

    dn.setIdCode(getCellValue(c));

    }else if(c.getColumnIndex() == 1){

    dn.setCaseName(getCellValue(c));

    }*/

    }

    rows.add(columns);

    }

    return rows;

    }

    /**

    * 得到每个单元格的值

    * @param c

    * @return

    */

    private static String getCellValue(Cell c) {

    String value = "";

    switch (c.getCellType()) {

    case Cell.CELL_TYPE_STRING:

    value = c.getRichStringCellValue().getString();

    break;

    case Cell.CELL_TYPE_NUMERIC:

    if (DateUtil.isCellDateFormatted(c)) {

    value = "" + c.getDateCellValue();

    } else {

    value = "" + (int) c.getNumericCellValue();

    }

    break;

    case Cell.CELL_TYPE_BOOLEAN:

    value = "" + c.getBooleanCellValue();

    break;

    case Cell.CELL_TYPE_FORMULA:

    value = "" + c.getCellFormula();

    break;

    }

    return value;

    }

    更多相关内容
  • Java 解析复杂表格excel

    千次阅读 2020-11-26 16:02:37
    在实际开发中,上传excel文件是十分常见的问题,一般情况下,解析的思路无非1. 固定表头进行解析;2. 每一行进行解析。但是偶尔会碰一下一些格式比较复杂的表格,用以上方式解析就 得不到我们想要的结果了。 例如...

    解析复杂表格

    在实际开发中,上传excel文件是十分常见的问题,一般情况下,解析的思路无非1. 固定表头进行解析;2. 每一行进行解析。但是偶尔会碰一下一些格式比较复杂的表格,用以上方式解析就 得不到我们想要的结果了。
    例如以下这张表,乍一看是不是有种心态崩溃的感觉,
    在这里插入图片描述
    面对这种复杂表格,就需要采取特殊的方式了,首先,还是将思路,实现放到最后再说;1.按照每一行去解析,但是在解析时,需要判断是否为单元格;2. 得到数据后,还需要根据行号进行过滤,然后对每一行单元格数据进行合并操作;3. 得到数据后,最后需要根据列号进行过滤,对每一列单元格进行合并操作。

    实现

    话不多说,上代码:

    1. 判断是否为单元格:
    /**
    	 *
    	 *
    	 * @param sheet
    	 *            表单
    	 * @param cellRow
    	 *            被判断的单元格的行号
    	 * @param cellCol
    	 *            被判断的单元格的列号
    	 * @return row: 行数;col列数
    	 * @throws IOException
    	 * @Author zhangxinmin
    	 */
    	private static Map<String, Integer> getMergerCellRegionRow(Sheet sheet, int cellRow,
    											  int cellCol) {
    		Map<String, Integer> map = new HashMap<>();
    		int retVal = 0, retCol= 0 ;
    		int sheetMergerCount = sheet.getNumMergedRegions();
    		for (int i = 0; i < sheetMergerCount; i++) {
    			CellRangeAddress cra = (CellRangeAddress) sheet.getMergedRegion(i);
    			int firstRow = cra.getFirstRow(); // 合并单元格CELL起始行
    			int firstCol = cra.getFirstColumn(); // 合并单元格CELL起始列
    			int lastRow = cra.getLastRow(); // 合并单元格CELL结束行
    			int lastCol = cra.getLastColumn(); // 合并单元格CELL结束列
    			if (cellRow >= firstRow && cellRow <= lastRow) { // 判断该单元格是否是在合并单元格中
    				if (cellCol >= firstCol && cellCol <= lastCol) {
    					retVal = lastRow - firstRow + 1; // 得到合并的行数
    					retCol = lastCol - firstCol + 1; // 得到合并的列数
    					break;
    				}
    			}
    		}
    		map.put("row", retVal);
    		map.put("col", retCol);
    		return map;
    	}
    
    private static Integer isMergedRegion(Sheet sheet,int row ,int column) {
    		int sheetMergeCount = sheet.getNumMergedRegions();
    		for (int i = 0; i < sheetMergeCount; i++) {
    			CellRangeAddress range = sheet.getMergedRegion(i);
    			int firstColumn = range.getFirstColumn();
    			int lastColumn = range.getLastColumn();
    			int firstRow = range.getFirstRow();
    			int lastRow = range.getLastRow();
    			if(row >= firstRow && row <= lastRow){
    				if(column >= firstColumn && column <= lastColumn){
    					return i;
    				}
    			}
    		}
    		return -1;
    	}
    
    1. 解析代码:
    public static List<CellRowAndColDTO> readDiffDataBySheet(Sheet sheet, int startRows){
    		List<CellRowAndColDTO> result = new ArrayList<>();
    		for (int rowIndex = startRows, z = sheet.getLastRowNum(); rowIndex <= z; rowIndex++) {
    			Row row = sheet.getRow(rowIndex);
    			if (row == null) {
    				continue;
    			}
    
    			int rowSize = row.getLastCellNum();
    			for (int columnIndex = 0; columnIndex < rowSize; columnIndex++) {
    				CellRowAndColDTO dto = new CellRowAndColDTO();
    				Cell cell = row.getCell(columnIndex);
    				if (cell != null){
    					// 读取单元格数据格式(标记为字符串)
    					cell.setCellType(CellType.STRING);
    					String value = cell.getStringCellValue();
    					if(0 != isMergedRegion(sheet, rowIndex,columnIndex)){//判断是否合并格
    						// 处理有值的cell
    //						if (StringUtils.isEmpty(value)) {
    //							continue;
    //						}
    						dto.setRow(rowIndex);
    						dto.setCol(columnIndex);
    						Map<String, Integer> map = getMergerCellRegionRow(sheet, rowIndex, columnIndex);//获取合并的行列
    						dto.setCellCol(map.get("col") == 0? 1:map.get("col"));
    						dto.setCellRow(map.get("row") == 0? 1:map.get("row"));
    						dto.setCellValue(value);
    						result.add(dto);
    
    					}else{
    						dto.setRow(rowIndex);
    						dto.setCol(columnIndex);
    						Map<String, Integer> map = getMergerCellRegionRow(sheet, rowIndex, columnIndex);//获取合并的行列
    						dto.setCellCol(1);
    						dto.setCellRow(1);
    						dto.setCellValue(value);
    						result.add(dto);
    					}
    
    				}
    			}
    		}
    		List<CellRowAndColDTO> dtos = new ArrayList<>();
    		Map<Integer, List<CellRowAndColDTO>> map = result.stream().collect(Collectors.groupingBy(CellRowAndColDTO::getRow));//根据行进行分组
    		map.forEach((k,v) -> {
    			for(int i =0;i<v.size();i++){
    				if(i!=0){
    					Integer col = dtos.get(dtos.size()-1).getCol()+dtos.get(dtos.size()-1).getCellCol();
    					if(v.get(i).getCol() == col){
    						dtos.add(v.get(i));
    						continue;
    					}
    				}else{
    					dtos.add(v.get(i));
    				}
    
    			}
    		});
    
    		List<CellRowAndColDTO> dtos2 = new ArrayList<>();
    		Map<Integer, List<CellRowAndColDTO>> map2 = dtos.stream().collect(Collectors.groupingBy(CellRowAndColDTO::getCol));//根据列分组
    		map2.forEach((k,v) -> {
    			for(int i =0;i<v.size();i++){
    				if(i!=0){
    					if(v.get(i).getCellRow() != 1){
    						if(v.get(i).getCellCol() == v.get(i-1).getCellCol() && v.get(i).getCellRow() == v.get(i-1).getCellRow()){
    							if(v.get(i).getCellRow() == 1 && v.get(i).getCellCol() == 1){
    								dtos2.add(v.get(i));
    								continue;
    							}else{
    								if(StringUtils.isBlank((v.get(i).getCellValue()))){
    									continue;
    								}
    							}
    						}
    					}
    
    				}
    				dtos2.add(v.get(i));
    			}
    		});
    		return dtos2;
    	}
    

    说明一下: 首先我先获取每一行,然后对该行的每一个单元格cell对象进行判断处理,判断时候为单元格,如果是,则将行号,列号,合并行数,合并列数,数值进行存储,存储到List集合;然后,对该集合进行过滤操作,通过java8 stream流的方式先根据行号进行分组,然后获取下一个格的位置col ,然后进行判断,如果是下一个格则进行存储;如果是该单元格内的空格,则跳出循环。然后再根据列进行分组,根据行号列号进行对合并格其他空格单元格进行过滤,最后完成数据库存储,完成解析操作。

    普通表格按行解析

    public static List<String[]> readData(String fileType, int startRows, boolean ignoreRowBlank, InputStream is) throws IOException {
    		List<String[]> result = new ArrayList<>();
    
    		Workbook wb = readWorkBook(fileType, is);
    		for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
    			Sheet sheet = wb.getSheetAt(sheetIndex);
    
    			for (int rowIndex = startRows, z = sheet.getLastRowNum(); rowIndex <= z; rowIndex++) {
    				Row row = sheet.getRow(rowIndex);
    				if (row == null) {
    					continue;
    				}
    
    				int rowSize = row.getLastCellNum();
    				String[] values = new String[rowSize];
    				boolean hasValue = false;
    				for (int columnIndex = 0; columnIndex < rowSize; columnIndex++) {
    					String value = "";
    					Cell cell = row.getCell(columnIndex);
    					if (cell != null) {
    						// 注意:一定要设成这个,否则可能会出现乱码,后面版本默认设置
    						switch (cell.getCellType()) {
    							case HSSFCell.CELL_TYPE_STRING:
    								value = cell.getStringCellValue();
    								break;
    							case HSSFCell.CELL_TYPE_NUMERIC:
    								if (HSSFDateUtil.isCellDateFormatted(cell)) {
    									Date date = cell.getDateCellValue();
    									if (date != null) {
    										value = new SimpleDateFormat("yyyy-MM-dd")
    												.format(date);
    									} else {
    										value = "";
    									}
    								} else {
    									//value = new DecimalFormat("0").format(cell.getNumericCellValue());
    									if (HSSFDateUtil.isCellDateFormatted(cell)) {
    										value = String.valueOf(cell.getDateCellValue());
    									} else {
    										cell.setCellType(Cell.CELL_TYPE_STRING);
    										String temp = cell.getStringCellValue();
    										// 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
    										if (temp.indexOf(".") > -1) {
    											value = String.valueOf(new Double(temp)).trim();
    										} else {
    											value = temp.trim();
    										}
    									}
    								}
    								break;
    							case HSSFCell.CELL_TYPE_FORMULA:
    								// 导入时如果为公式生成的数据则无值
    								if (!cell.getStringCellValue().equals("")) {
    									value = cell.getStringCellValue();
    								} else {
    									value = cell.getNumericCellValue() + "";
    								}
    								break;
    							case HSSFCell.CELL_TYPE_BLANK:
    								break;
    							case HSSFCell.CELL_TYPE_ERROR:
    								value = "";
    								break;
    							case HSSFCell.CELL_TYPE_BOOLEAN:
    								value = (cell.getBooleanCellValue() == true ? "Y"
    
    										: "N");
    								break;
    							default:
    								value = "";
    						}
    					}
    					values[columnIndex] = value;
    					if (!value.isEmpty()) {
    						hasValue = true;
    					}
    				}
    				if (!ignoreRowBlank || hasValue) {//不为忽略空行模式或不为空行
    					result.add(values);
    				}
    			}
    		}
    		return result;
    	}
    

    这里我就不过多叙述这个按行解析了,代码思路比较简单一看就能懂。

    总结

    该文章为我总结平时开发过程中解决的难题的经验和思路;如果有更好的解决办法希望能不吝赐教。大家携手在开发的道路上越走越远。不喜勿喷。

    展开全文
  • java解析复杂excel表格并导入数据库

    千次阅读 2021-01-08 11:52:26
    最近接到一个需求,需要把一份37万的excel数据解析并导入数据库, 分析 表格格式相对复杂包含很多合并单元格, 不符合通过navicat直接导入的要求, 数据量比较大, 建议一次保存25条,否则会导致内存泄漏; 代码 1.引入依赖...

    前言
    最近接到一个需求,需要把一份37万的excel数据解析并导入数据库,
    分析
    表格格式相对复杂包含很多合并单元格, 不符合通过navicat直接导入的要求, 数据量比较大, 建议一次保存25条,否则会导致内存泄漏;
    代码
    1.引入依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.9</version>
    </dependency>
    

    2.具体操作代码
    2.1.判断指定的单元格是否为合并单元格

    /**
     * 判断指定的单元格是否是合并单元格
     *
     * @param sheet
     * @param row    行下标
     * @param column 列下标
     * @return
     */
    private static boolean isMergedRegion(Sheet sheet, int row, int column) {
        //获取该sheet所有合并的单元格
        int sheetMergeCount = sheet.getNumMergedRegions();
        //循环判断 该单元格属于哪个合并单元格, 如果能找到对应的,就表示该单元格是合并单元格
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            int firstColumn = range.getFirstColumn();
            int lastColumn = range.getLastColumn();
            int firstRow = range.getFirstRow();
            int lastRow = range.getLastRow();
            if (row >= firstRow && row <= lastRow) {
                if (column >= firstColumn && column <= lastColumn) {
                    return true;
                }
            }
        }
        return false;
    }
    

    2.2.获取合并单元格的值

    /**
     * 获取合并单元格的值
     *
     * @param sheet  sheet索引 从0开始
     * @param row    行索引 从0开始
     * @param column 列索引  从0开始
     * @return
     */
    public static String getMergedRegionValue(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress ca = sheet.getMergedRegion(i);
            int firstColumn = ca.getFirstColumn();
            int lastColumn = ca.getLastColumn();
            int firstRow = ca.getFirstRow();
            int lastRow = ca.getLastRow();
            if (row >= firstRow && row <= lastRow) {
                if (column >= firstColumn && column <= lastColumn) {
                    Row fRow = sheet.getRow(firstRow);
                    Cell fCell = fRow.getCell(firstColumn);
                    return getCellValue(fCell);
                }
            }
        }
        return null;
    }
    

    2.3.获取单元格的值(不是合并单元格)

    /**
     * 获取单元格的值  先确定单元格的类型,然后根据类型 取值
     *
     * @param cell 单元格
     * @return
     */
    public static String getCellValue(Cell cell) {
        if (cell == null) return "";
        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
            return cell.getStringCellValue();
        } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return String.valueOf(cell.getBooleanCellValue());
        } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
            return cell.getCellFormula();
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return String.valueOf(cell.getNumericCellValue());
        }
        return "";
    }
    

    2.4.解析完一行数据后,判断对象的属性是否都为空

    /**
     * 判断一个对象的属性是否都为空,
     *
     * @param obj 对象
     * @return false : 至少有一个属性不为空, true: 该对象的属性全为空
     */
    public boolean allFieldIsNULL(Object obj) {
        Boolean flag = true;//都为空
        if (null == obj || "".equals(obj)) return flag;
        try {
            Field[] declaredFields = obj.getClass().getDeclaredFields();
            for (Field field : declaredFields) { // 循环该类,取出类中的每个属性
                field.setAccessible(true);// 把该类中的所有属性设置成 public
                Object object = field.get(obj); // object 是对象中的属性
                if (object instanceof CharSequence) { // 判断对象中的属性的类型,是否都是CharSequence的子类
                    if (!Objects.isNull(object)) { // 如果是他的子类,那么就可以用ObjectUtils.isEmpty进行比较
                        flag = false;//不为空
                    }
                } else { //如果不是那就直接用null判断
                    if (!(null == object || "".equals(object))) {
                        flag = false;//不为空
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;//false:不都为空
    }
    

    2.5.解析excel的工具类

    /**
     * 读取excel文件
     *
     * @param
     * @param sheetIndex    sheet页下标:从0开始
     * @param startReadLine 开始读取的行:从0开始
     * @param tailLine      结束行
     */
    public void readExcel(String path, int sheetIndex, int startReadLine, int tailLine) {
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
        //读取excel表中的sheet, 参数为sheet的索引值(从0开始)
        Sheet sheet = wb.getSheetAt(sheetIndex);
        Row row = null;
        Boolean save = false;
        //获取该sheet的最后一行数据的索引
        int lastRowNum = sheet.getLastRowNum();
        ArrayList<CmsIndexCategory> list = new ArrayList<>();
        //外循环是循环行,内循环是循环每行的单元格
        for (int i = startReadLine; i <= lastRowNum; i++) {
            CmsIndexCategory indexCategory = new CmsIndexCategory();
            //根据行索引获取行对象(单元格集合)
            row = sheet.getRow(i);
            //遍历行的单元格,并解析
            for (Cell c : row) {
                String returnStr = "";
                String trim = "";
                //设置该单元格的数据的类型为String
                c.setCellType(Cell.CELL_TYPE_STRING);
                boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
                // 判断是否具有合并单元格
                if (isMerge) {
                //如果是合并单元格,就获取合并单元格的值
                    returnStr = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex()).toString();
                } else {
                //不是合并单元格直接获取单元格的值
                    returnStr = getCellValue(c).toString();
                }
                if (Objects.nonNull(returnStr) && StringUtils.isNotEmpty(returnStr)) {
                    trim = returnStr.trim();
                    //封装结果集,一行数据封装为一个对象
                    if (c.getColumnIndex() == 0) {
                        indexCategory.setAgencyBrand(trim);
                    } else if (c.getColumnIndex() == 1) {
                        indexCategory.setCompanyName(trim);
                    } else if (c.getColumnIndex() == 2) {
                        indexCategory.setIndustryField(trim);
                    } else if (c.getColumnIndex() == 3) {
                        indexCategory.setDetectionField(trim);
                    } else if (c.getColumnIndex() == 4) {
                        indexCategory.setDetectionObj(trim);
                    } else if (c.getColumnIndex() == 5) {
                        indexCategory.setSampleCategory(trim);
                    } else if (c.getColumnIndex() == 6) {
                        indexCategory.setDetectionRange(trim);
                    } else if (c.getColumnIndex() == 7) {
                        indexCategory.setDetectionItem(trim);
                    } else if (c.getColumnIndex() == 8) {
                        indexCategory.setDetectionStandard(trim);
                    }
                }
            }
            //判断一个对象的属性是否都为空, true:都为空  , false: 不都为空
            if (!allFieldIsNULL(indexCategory)) {
                //该对象不都为空的情况下,添加到集合中
                list.add(indexCategory);
            }
            //一次保存25条数据,最后一次数据不够25条也进行保存
            if (list.size() == 25 || i == lastRowNum) {
                save = this.iCmsIndexCategoryService.saveBatch(list);
                System.out.println("==================================================第------" + (i + 1) + "---------行保存结果为======================================== " + save);
                list.clear();
            }
        }
    }
    

    3.具体实践

    @GetMapping("/excel")
    public String excel2() {
        this.readExcel("C:\\Users\\yangmin\\Desktop\\我要测资料\\特色检测项目\\7.xlsx", 0, 0, 0);
        return "完成";
    }
    
    展开全文
  • 使用POI框架解析复杂的Excel文件+Java后端开发人员+解析复杂Excel文件。内部含有测试使用文件,以及详细的代码注解。
  • 使用poi读取写入复杂excel内容
  • 怎样用java向excel中写数据public void export(List li, String dateString,String[] title) throws WriteException, IOException {// 准置excel工作表的标题// 创Excel工作薄WritableWorkbook wwb = null;...

    怎样用java向excel中写数据

    public void export(List li, String dateString,String[] title) throws WriteException, IOException {

    // 准置excel工作表的标题

    // 创Excel工作薄

    WritableWorkbook wwb = null;

    try {

    // 输出的excel的路径

    String filePath1 = Const.pathStr Const.pathStr4 Const.pathStr3;

    File file = new File(filePath1);

    if(!file.exists()){

    file.mkdir();

    }

    String filePath=filePath1 Const.pathStr4 Const.pathStr6 dateString Const.pathStr5;

    // 立一个jxl文件,即在C生成testJXL.xls

    OutputStream os = new FileOutputStream(filePath);

    wwb = Workbook.createWorkbook(os);

    // 添加第一个工作表并设置第一个Sheet的名字

    WritableSheet sheet = wwb.createSheet("设备清单", 0);

    Label label;

    for (int i = 0; i < title.length; i ) {

    // Label(x,y,z) 代表单元格的第x 1列,第y 1行, 内容z

    // 在Label对象的子对象中指明单元格的位置和内容

    label = new Label(i, 0, title[i]);

    // 将定义好的单元格添加到工作表中

    sheet.addCell(label);

    }

    for (int i = 0; i < li.size(); i ) {

    int j = 0;

    j = i 1;

    //填充单元格

    //获取区域名称

    label = new Label(0, j, li.get(i).getQyName());

    sheet.addCell(label);

    //获取区域名称

    label = new Label(1, j, li.get(i).getJzName());

    sheet.addCell(label);

    //获取设备名称

    label = new Label(2, j, li.get(i).getLnodeName());

    sheet.addCell(label);

    // //获取设备类型名称

    label = new Label(3, j, li.get(i).getSbxh());

    sheet.addCell(label);

    //获取运行状态

    label = new Label(4, j, li.get(i).getYxzh());

    sheet.addCell(label);

    //获取删除状态

    label = new Label(5, j, li.get(i).getDeleteFlag());

    sheet.addCell(label);

    //获取启用状态

    label = new Label(6, j, li.get(i).getQyzt());

    sheet.addCell(label);

    //获取设备投运日期

    label = new Label(7, j, li.get(i).getSbtyri());

    sheet.addCell(label);

    //获取使用年限

    jxl.write.Number numb1 = new jxl.write.Number(8, j, li.get(i).getSynx());

    sheet.addCell(numb1);

    //获取区域名称

    label = new Label(9, j, li.get(i).getAddUser());

    sheet.addCell(label);

    //获取区域名称

    label = new Label(10, j, li.get(i).getUpdUser());

    sheet.addCell(label);

    //获取区域名称

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    String newdate = sdf.format(li.get(i).getUpdTime());

    label = new Label(11, j, newdate);

    sheet.addCell(label);

    //获取区域名称

    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");

    String newdate2 = sdf2.format(li.get(i).getAddTime());

    label = new Label(12, j, newdate2);

    sheet.addCell(label);

    //获取区域名称

    label = new Label(13, j, li.get(i).getZcbh());

    sheet.addCell(label);

    //获取区域名称

    label = new Label(14, j, li.get(i).getSbcs());

    sheet.addCell(label);

    //获取区域名称

    jxl.write.Number numb2 = new jxl.write.Number(15, j, li.get(i)

    .getSbll());

    sheet.addCell(numb2);

    //获取区域名称

    label = new Label(16, j, li.get(i).getRldw());

    sheet.addCell(label);

    //获取区域名称

    label = new Label(17, j, li.get(i).getWxghjl());

    sheet.addCell(label);

    }

    // 写入数据

    wwb.write();

    } catch (Exception e) {

    e.printStackTrace();

    }finally{

    // 关闭文件

    wwb.close();

    }

    }

    Const文件:

    /**路径:C盘*/

    public static String pathStr = "C:";

    /**路径://*/

    public static String pathStr2 = "//";

    /**文件夹:workspace*/

    public static String pathStr3 = "exportFile";

    /**文件名:world*/

    public static String pathStr6 = "Equipment";

    /**路径:/*/

    public static String pathStr4 = "/";

    /**路径:.xls*/

    public static String pathStr5 = ".xls";

    Java里面怎么调用excel表格中的x行第y列的数据,将其赋值到int型变量i

    InputStream inp = new FileInputStream("workbook.xls");

    //InputStream inp = new FileInputStream("workbook.xlsx");

    Workbook wb = WorkbookFactory.create(inp);

    Sheet sheet = wb.getSheetAt(0);

    Row r = sheet.getRow(x);

    Cell c = r.getCell(y);

    int value = c.getNumericCellValue();

    如何用JAVA读取EXCEL文件里面的数据

    poi能你的问题

    import java.io.BufferedReader;

    import java.io.File;

    import java.io.FileReader;

    import java.io.IOException;

    import static java.lang.System.out;

    public class FileTest {

    /**

    * @param args

    * @throws IOException

    */

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

    String string = "";

    File file = new File("c:" File.separator "xxx.xls");

    FileReader fr = new FileReader(file);

    BufferedReader br = new BufferedReader(fr);

    String str;

    while((str = br.readLine()) != null) {

    string = str;

    }

    out.println(string);

    }

    }

    在java中可以调用excel函数库吗

    虽然理论上可以,其实很不好弄。

    展开全文
  • java导出excel复杂表头

    2019-02-20 16:09:50
    java工程,源代码,可直接运行,需自己改造成web下载方式。
  • 关于Excel数据处理,很多同学可能使用过Pyhton的pandas模块,用它可以轻松地读取和转换Excel数据。但是实际中Excel表格结构可能比较杂乱,数据会分散不同的工作表中,而且在表格中分布很乱,这种情况下啊直接使用...
  • js解析Excel

    2018-11-14 14:41:18
    js解析Excel数据xlsx.full.min.js
  • java读取Excel表格(Demo),演示了java读取excel文件的操作。eclipse
  • 老外分享的excel公式解析器源码 其他网站整理的有关C#表达式解析器源代码。(一个C#实现的简单表达式解析器,支持算符优先级、括号以及函数) 数据结构大概如下: 附件内容截图: 说明:This cpp port use PCRE as it's...
  • 文件中包含了两个js的文件分别是一下两个 1.xlsx.utils.js 2.xlsx.full.min.js
  • Excel如何从复杂文本中提取指定数值

    千次阅读 2021-08-29 18:04:25
    今天小编跟大家分享一下Excel如何从复杂文本中提取指定数值 1.如下图我们想要从复杂文本中提取最后面的数值 2.首先我们选中复杂文本单元格区域 3.点击下图选项(Excel工具箱,百度即可了解详细...
  • Python Excel解析

    千次阅读 2021-06-04 13:29:14
    Python解析Excel时需要安装两个包,分别是xlrd(读excel)和xlwt(写excel),安装方法如下: 读取excel前需要先引入该模块(import xlrd)。但是需要注意的是,用xlrd读取excel表时,返回的xlrd.Book类型,是只读...
  • java中excel文件解析的各类方法及其代码实现
  • Excel解析的几种实现方式

    千次阅读 2020-08-31 00:44:56
    文章目录Java读写Excel的方法POIJXLFastExcel读写PDFJXL的使用写Excel文档读取ExcelPOI使用写入Excel读取Excel创建高版本的Excel Java读写Excel的方法 有三种方式: POI JXL FASTEXCEL POI 是Apache软件基金会的...
  • 前端js解析Excel表格,并且用ajax将数据发送到java后台,用字符串接收,以及后台对字符串的处理。
  • // 获取excel工作簿对象 List<AutoExcelToSqlDTO> tableInfos = new ArrayList(); String substring = filename.substring(filename.lastIndexOf("."), filename.length()); if (".xls".equals(substring)) { ...
  • Java导入复杂excel

    千次阅读 2021-03-16 13:22:33
    Java 导入复杂excel,多表格中有合并以及描述 接口返回类 package com.hs.report.utils; import com.hs.report.enums.ResultCode; import org.apache.commons.lang.StringUtils; import java.io.Serializable; ...
  • 复杂格式不规范excel 文件解析

    千次阅读 2018-05-30 15:32:47
     * 解析excel  */  public class ExcelFileParser {     public static Workbook getWb(String path) {   try {   return WorkbookFactory.create(new File(path));   } catch (Exception e) {   ...
  • java 使用POI导入复杂excel表格
  • Java导出Excel 复杂表头

    2021-03-12 17:42:08
    一种是直接使用模板直接添加数据就可以=== 复杂的表头 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</...
  • SpringBoot 实现Excel文件解析

    千次阅读 2022-03-22 09:55:14
    接下来由阿灿我来介绍一下集成SpringBoot 实现批量导入Excel数据的功能。 二、依赖准备: 这里我们使用apache下的poi依赖,当然你也可以使用阿里巴巴的easyexcel工具类(下次我们再聊) <dependency> &...
  • Java解析Excel

    2020-08-04 09:46:37
    来公司一个多月了。一直在参与公司的大数据研发。因为研发人员相对较少,公司规模处于中小型规模。很多细节制度还不够完善。...第一次经历Excel文件有百万行级别的记录,是不是很难想象啊!刚打开文件都需要几分钟。这
  • 一篇文章教你如何使用apache POI框架解析工作中遇到的复杂Excel文件,内含完整项目代码以及测试文件。
  • 实现必要基础,个人认为需要接口传文件的时候附加其他业务参数,如年级等,其次还需要比较完整的解析excel文件 (1)、接口调用方式和接口定义 接口定义如下,用MultipartFile来接收文件,其他入参包含在对象中 ...
  • 背景:近日,发现了一个解析excel的springboot-starter(pom依赖如下),挺好玩,使用尤其简单,复刻了下代码,了解一下 <dependency> <groupId>com.pig4cloud.excel</groupId> <...
  • } /** * 所有数据解析完成都会调用 */ @Override public void doAfterAllAnalysed(AnalysisContext context) { userList.forEach(System.out::println); } } 三、编写controller package com.test.demo.controller;...
  • C# 解析Excel

    千次阅读 2019-01-03 12:14:37
    分享一篇自己写的 解析Excel的代码 网上很多帖子都写的太复杂了,就自己重新整理了一份 支持读写 Microsoft.Office.Interop.Excel 这个是个DLL 直接百度下载就可以了。 添加进解决方案的引用 using Microsoft.Office...
  • 创建excel对应的实体对象(复杂头写入)2. 获取写入的数据3. Web中的写读Excel(2.7.0版本)1. 创建excel对应的实体对象(复杂头读取)2. 监听器3. 接口4. 读excel 简介 EasyExcel是一个基于Java的简单、省内存的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,933
精华内容 7,573
关键字:

复杂excel的解析