首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Excel文件中逐行读取值,并将其放入Map中?

如何从Excel文件中逐行读取值,并将其放入Map中?
EN

Stack Overflow用户
提问于 2015-04-18 15:21:13
回答 2查看 8.2K关注 0票数 0

我的目标是读取一个excel文档的已知格式,读取每个单元格和列一次。每一行将被设置为一个名为Item的bean,该bean将被放入一个映射中,并以其键作为项目号。一旦我这样做,我可以继续其馀的程序,并放入一个数据库。目前,我一次整篇专栏文章,并试图找出如何做到这一点。

代码语言:javascript
复制
public class Excel {

    private Items items;

    Excel(Items items) {
        this.items = items;
    }

    public static void main(String[] args) {

        JFileChooser fileChooser = new JFileChooser();
        int returnVlue = fileChooser.showOpenDialog(null);

        Map<Long, Items> map1 = new HashMap<Long, Items>();

        String mat, thick, size, lbsPerSheet, lbs;

        if (returnVlue == JFileChooser.APPROVE_OPTION) {

            try {
                Workbook workbook = new HSSFWorkbook(new FileInputStream(
                        fileChooser.getSelectedFile()));
                Sheet sheet = workbook.getSheetAt(0);

                for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext();) {

                    Row row = rit.next();

                    for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext();) {
                        Cell cell = cit.next();
                        cell.setCellType(Cell.CELL_TYPE_STRING);

                        mat = cell.getStringCellValue();
                        thick = cell.getStringCellValue();
                        size = cell.getStringCellValue();
                        lbsPerSheet = cell.getStringCellValue();
                        lbs = cell.getStringCellValue();

                        System.out.println("Mat "+mat+" Thick "+ thick+" Size "+size+" lbs Per Sheet "+lbsPerSheet+" lbs "+lbs+ "\t");
                    }
                    System.out.println();

                }

            } catch (Exception e) {
                // TODO: handle exception
            }

        }

    }
}

输出

代码语言:javascript
复制
Mat 11960120 Thick 11960120 Size 11960120 lbs Per Sheet 11960120 lbs 11960120   
Mat 0.119 Thick 0.119 Size 0.119 lbs Per Sheet 0.119 lbs 0.119  
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 250 Thick 250 Size 250 lbs Per Sheet 250 lbs 250    
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 18860120 Thick 18860120 Size 18860120 lbs Per Sheet 18860120 lbs 18860120   
Mat 0.188 Thick 0.188 Size 0.188 lbs Per Sheet 0.188 lbs 0.188  
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 383 Thick 383 Size 383 lbs Per Sheet 383 lbs 383    
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 25060120 Thick 25060120 Size 25060120 lbs Per Sheet 25060120 lbs 25060120   
Mat 0.25 Thick 0.25 Size 0.25 lbs Per Sheet 0.25 lbs 0.25   
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 510 Thick 510 Size 510 lbs Per Sheet 510 lbs 510    
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 25072144 Thick 25072144 Size 25072144 lbs Per Sheet 25072144 lbs 25072144   
Mat 0.25 Thick 0.25 Size 0.25 lbs Per Sheet 0.25 lbs 0.25   
Mat 72x144 Thick 72x144 Size 72x144 lbs Per Sheet 72x144 lbs 72x144 
Mat 734.4 Thick 734.4 Size 734.4 lbs Per Sheet 734.4 lbs 734.4  
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 31360120 Thick 31360120 Size 31360120 lbs Per Sheet 31360120 lbs 31360120   
Mat 0.313 Thick 0.313 Size 0.313 lbs Per Sheet 0.313 lbs 0.313  
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 633.2616 Thick 633.2616 Size 633.2616 lbs Per Sheet 633.2616 lbs 633.2616   
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 37560120 Thick 37560120 Size 37560120 lbs Per Sheet 37560120 lbs 37560120   
Mat 0.375 Thick 0.375 Size 0.375 lbs Per Sheet 0.375 lbs 0.375  
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 758.7 Thick 758.7 Size 758.7 lbs Per Sheet 758.7 lbs 758.7  
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 50060120 Thick 50060120 Size 50060120 lbs Per Sheet 50060120 lbs 50060120   
Mat 0.5 Thick 0.5 Size 0.5 lbs Per Sheet 0.5 lbs 0.5    
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 1011.6 Thick 1011.6 Size 1011.6 lbs Per Sheet 1011.6 lbs 1011.6 
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 75060120 Thick 75060120 Size 75060120 lbs Per Sheet 75060120 lbs 75060120   
Mat 0.75 Thick 0.75 Size 0.75 lbs Per Sheet 0.75 lbs 0.75   
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 1517.4 Thick 1517.4 Size 1517.4 lbs Per Sheet 1517.4 lbs 1517.4 
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Row org.apache.poi.hssf.usermodel.HSSFRow@2a
Mat 10060120 Thick 10060120 Size 10060120 lbs Per Sheet 10060120 lbs 10060120   
Mat 1 Thick 1 Size 1 lbs Per Sheet 1 lbs 1  
Mat 60x120 Thick 60x120 Size 60x120 lbs Per Sheet 60x120 lbs 60x120 
Mat 2023.2 Thick 2023.2 Size 2023.2 lbs Per Sheet 2023.2 lbs 2023.2 
Mat 0.41 Thick 0.41 Size 0.41 lbs Per Sheet 0.41 lbs 0.41   

Excel文件

代码语言:javascript
复制
11960120        0.119   60x120  250.00   $0.4100 
18860120        0.188   60x120  383.00   $0.4100 
25060120        0.250   60x120  510.00   $0.4100 
25072144        0.250   72x144  734.40   $0.4100 
31360120        0.313   60x120  633.26   $0.4100 
37560120        0.375   60x120  758.70   $0.4100 
50060120        0.500   60x120  1011.60  $0.4100 
75060120        0.750   60x120  1517.40  $0.4100 
10060120        1.000   60x120  2023.20  $0.4100 

我想读上面的excel文件,非常像一个二维数组。例如:

代码语言:javascript
复制
array[0][0] = 11960120; array[0][1] = 0.119; array[0][2]= "60x120";

如果我能够读取像上面这样的行和列,请使用项目类中的getter和setter,然后简单地将" item“放到一个映射中,并用项目号包装它,例如,在上面的excel示例中,11960120位于单元格中。

更清楚的是,我想像下面这样读取excel文件

代码语言:javascript
复制
11960120    0.119   60x120  250.00   $0.4100 

然后读下一行

代码语言:javascript
复制
18860120    0.188   60x120  383.00   $0.4100

每个单元格将被设置为Item类。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-18 16:14:00

您可以使用Apache Metamodel库查询Excel电子表格。下面显示的方法保留列名,这样您就可以编写一个方法,通过列名和行号来获取值。如果不希望/有列名,则必须对此代码进行调整:

代码语言:javascript
复制
private static org.slf4j.Logger logger = LoggerFactory.getLogger( "Data" );

public static Object[][] getExcelData( File excelFile, String sheetName ) 
{   
    ExcelConfiguration conf = new ExcelConfiguration( 1, true, false );
    DataContext dataContext = DataContextFactory.createExcelDataContext( excelFile, conf );
    DataSet dataSet = dataContext.query()
            .from( sheetName )
            .selectAll()
            .where("run").eq("Y")
            .execute();
    List<Row> rows = dataSet.toRows();
    Object[][] myArray = get2ArgArrayFromRows( rows );
    return myArray;
}

/**
 * Gets a 2D Object array from a List of Row objects that is only 2 args wide.
 * @param rows
 * @return
 */
public static Object[][] get2ArgArrayFromRows( List<Row> rows ) {
    Object[][] myArray = new Object[rows.size()][2];
    int i = 0;
    SelectItem[] cols = rows.get(0).getSelectItems();
    for ( Row r : rows ) {
        Object[] data = r.getValues();
        for ( int j = 0; j < cols.length; j++ ) {
            if ( data[j] == null ) data[j] = ""; // force empty string where there are NULL values
        }
        myArray[i][0] = cols;
        myArray[i][2] = data;
        i++;
    }
    logger.info( "Row count: " + rows.size() );
    logger.info( "Column names: " + Arrays.toString( cols ) );
    return myArray;
}

然后,如果您愿意,可以使用谷歌番石榴将二维数组转换为列表.(我认为转换成地图会有问题,如果有欺骗?):

代码语言:javascript
复制
Double[][] array;
List<List<Double>> list = Lists.transform(Arrays.asList(array),
  new Function<Double[], List<Double>>() {
    @Override public List<Double> apply(Double[] row) {
      return Arrays.asList(row);
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-18 16:19:58

你的当前回路:

代码语言:javascript
复制
          for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext();) {

                Row row = rit.next();

                for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext();) {
                    Cell cell = cit.next();
                    cell.setCellType(Cell.CELL_TYPE_STRING);

                    mat = cell.getStringCellValue();
                    thick = cell.getStringCellValue();
                    size = cell.getStringCellValue();
                    lbsPerSheet = cell.getStringCellValue();
                    lbs = cell.getStringCellValue();

                    System.out.println("Mat "+mat+" Thick "+ thick+" Size "+size+" lbs Per Sheet "+lbsPerSheet+" lbs "+lbs+ "\t");
                }
                System.out.println();

            }

...is基本上说:“对于这张表中的每一行和每个单元格,将该特定单元格的值放入这五个不同的变量”。cell是当前单元格,获取其字符串值并将其放入所有变量实际上是没有意义的。您可能希望第一个单元格转到mat,第二个单元格转到thick等等。你可以做这两件事中的任何一件:

  1. 分配给不循环的值: 对于(Iterator rit = sheet.rowIterator();rit.hasNext();) { Row row = rit.next();Iterator cit = row.cellIterator()单元格;if ( cit.hasNext() ){ Cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);mat = cell.getStringCellValue();} if ( cit.hasNext() ){ cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);cell.getStringCellValue();} if ( cit.hasNext() ){ cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);size = cell.getStringCellValue();} if ( cit.hasNext() ){ cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);lbsPerSheet = cell.getStringCellValue();} if ( cit.hasNext() ){ cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);lbs = cell.getStringCellValue();} System.out.println("Mat "+mat+“稠密"+ thick+”大小为"+size+“lbs每页"+lbsPerSheet+”lbs "+lbs+ "\n");}
  2. 使用数组和循环: 对于(Iterator rit = sheet.rowIterator();rit.hasNext();) { row Row = rit.next();String[] cells =新Stringrow.getPhysicalNumberOfCells();int i= 0;for (Iterator cit = row.cellIterator();cit.hasNext();) { Cell = cit.next();cell.setCellType(Cell.CELL_TYPE_STRING);cellsi++ = cell.getStringCellValue();} //此时,您可以将单元格的值放在//映射条目中。System.out.println(Arrays.toString(单元);}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29719212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档