Java POI读取Excel的时候怎么按列读取

 刺客狙侠者 发布于 2022-11-03 16:10

Excel结构如图所示,我现在有两行数据,我要把这两行数据给对应起来.
第一行的数据,表示的是一个分类,第二行是这个分类下的子类.
比如性别分类有男和女,年龄段分类有青年,中年,老年.后面依次.
我现在读取Excel的时候,怎么才能把他们对应起来呢.
我的想法是按照列读取,但是POI好像没有按列读取的方法.
或者谁有更好的建议,提出来,帮帮我.

3 个回答
  • 《使用POI按Excel标题动态读取列数据》http://www.mybry.com/?p=291

    2022-11-06 04:58 回答
  • 采纳的这个答案有一点小问题就是所有的数据都是写死的.我自己又折腾了一下,把数据写活了.代码如下

    package org.linuxsogood.miscTest;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Random;
    
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    public class TestPOIP1Title {
        public static void main(String[] args) throws Exception {
            
            String pathname = "E:\\files\\title.xlsx";
            File file = new File(pathname);
            InputStream in = new FileInputStream(file);
            //得到整个excel对象
            XSSFWorkbook excel = new XSSFWorkbook(in);
            //获取整个excel有多少个sheet
            int sheets = excel.getNumberOfSheets();
            //便利第一个sheet
            Map<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());
                            }
                        }
                    }
                }
            }
        }
    }
    

    运行的结果如下

        
    性别<-->男
    性别<-->女
    年龄段<-->青年
    年龄段<-->中年
    年龄段<-->老年
    年代情怀<-->60前
    年代情怀<-->60后
    年代情怀<-->70后
    年代情怀<-->80后
    年代情怀<-->90后
    年代情怀<-->00后
    行业<-->IT|通信|电子|互联网
    行业<-->金融业
    行业<-->房地产|建筑工程
    行业<-->设计|印刷|艺术
    行业<-->财务|人力资源|行政
    行业<-->贸易|批发|零售|租赁业
    行业<-->咨询|法律|教育|翻译
    行业<-->销售|客服|市场
    行业<-->生产|加工|制造
    行业<-->交通|运输|物流|仓储
    行业<-->服务业
    行业<-->文化|传媒
    行业<-->娱乐|体育
    行业<-->能源|矿产|环保|科研
    行业<-->政府|非盈利机构
    行业<-->农|林|牧|渔
    行业<-->学生
    兴趣<-->音乐
    兴趣<-->美食
    兴趣<-->运动
    兴趣<-->旅行
    兴趣<-->摄影
    兴趣<-->电影
    兴趣<-->读书
    兴趣<-->购物
    兴趣<-->经管金融
    兴趣<-->人文
    兴趣<-->艺术
    兴趣<-->娱乐
    兴趣<-->游戏
    兴趣<-->命理|运势|占卜
    兴趣<-->居家
    兴趣<-->时尚
    兴趣<-->极客
    兴趣<-->趣味
    兴趣<-->自我管理
    兴趣<-->教育
    兴趣<-->设计
    兴趣<-->动漫
    兴趣<-->美容护肤
    宗教信仰<-->佛教
    宗教信仰<-->基督教
    宗教信仰<-->伊斯兰教
    岗位状态<-->自由职业
    岗位状态<-->退休
    婚恋状态<-->单身
    婚恋状态<-->异地恋
    婚恋状态<-->同城恋
    婚恋状态<-->已婚
    婚恋状态<-->离异
    生育状态<-->已生育
    生育状态<-->未生育
    
    
    2022-11-06 05:05 回答
  • public static void main(String[] args) throws Exception {
            InputStream is = new FileInputStream("d:/test.xls");
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
            HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
            
            HSSFRow title = sheetAt.getRow(0);
            
            HSSFCell cf = null;
            HSSFCell c = null;
            for (int rowNum = 1; rowNum <= sheetAt.getLastRowNum(); rowNum++) {
                HSSFRow r = sheetAt.getRow(rowNum);
                
                cf = title.getCell(0); //性别
                c = r.getCell(0);//男
                System.out.println(cf.getStringCellValue() + ":" + c.getStringCellValue());
                c = r.getCell(1);//女
                System.out.println(cf.getStringCellValue() + ":" + c.getStringCellValue());
                
                
                cf = title.getCell(2); //年龄
                c = r.getCell(2);//年轻
                System.out.println(cf.getStringCellValue() + ":" + c.getStringCellValue());
                c = r.getCell(3);//中年
                System.out.println(cf.getStringCellValue() + ":" + c.getStringCellValue());
                c = r.getCell(4);//老年
                System.out.println(cf.getStringCellValue() + ":" + c.getStringCellValue());
            }
        }

    2022-11-06 05:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有