java - 如何使用 Apache POI 解析保存在 Excel 文件中的树结构

标签 java excel scala groovy tcl

全部,

早上好!

我有一个 Excel 文件,其中列出的数据如下,我正在尝试使用 POI 进行解析

A           
    B       
        C   
            D1
            D2
        F   
            G1
            G2
            G3
        M   
            S1
    R       
        T   
    U       
L           
    X       
        Y   
            Z

是否可以生成如下所示的输出

A
A-->B
A-->B-->C
A-->B-->C-->D1
A-->B-->C-->D2
A-->B-->F
A-->B-->F-->G1
A-->B-->F-->G2
A-->B-->F-->G3
A-->B-->M
A-->B-->M-->S1
A-->R
A-->R-->T
A-->U
L
L-->X
L-->X-->Y
L-->X-->Y-->Z

我已经尝试了很长一段时间,但还没有弄清楚逻辑

谢谢

最佳答案

使用 Apache POI 的 Java 解决方案:

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

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 ParseTreeDemo 
{
    private static final int NUM_COLUMNS = 4;

    public static void main(String[] args)
    {

        try
        {
            FileInputStream file = new FileInputStream(new File("Test.xlsx"));

            XSSFWorkbook workbook = new XSSFWorkbook(file);
            XSSFSheet sheet = workbook.getSheetAt(0);

            // Use a column marker to save the 'farthest' column so far
            int currColMarker = -1;
            List<String> list = new ArrayList<>();

            //Iterate through each rows one by one
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) 
            {
                Row row = rowIterator.next();

                for(int currCol = 0; currCol < NUM_COLUMNS; currCol++)
                {
                    Cell cell = row.getCell(currCol);
                    if(cell == null)
                        continue;

                    if(cell.getCellType() == Cell.CELL_TYPE_STRING) {

                        if(currCol > currColMarker) {

                            // A farther column, simply append and
                            // update column marker
                            currColMarker = currCol;

                            list.add(cell.getStringCellValue());
                        }
                        else if (currCol == currColMarker) {

                            // At same level as column marker
                            // Remove old value at same level, before appending
                            list.remove(list.size() - 1);
                            list.add(cell.getStringCellValue());
                        }
                        else {

                            // At a 'nearer' column, remove those values beyond
                            // this level before appending
                            currColMarker = currCol;

                            list = list.subList(0, currCol);
                            list.add(cell.getStringCellValue());
                        }
                    }
                }

                // For displaying the current contents
                StringBuilder sb = new StringBuilder();
                for(String s : list) {
                    if(sb.length() != 0) {
                        sb.append("-->");
                    }
                    sb.append(s);
                }
                System.out.println(sb.toString());

            }
            file.close();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}

输出:

A
A-->B
A-->B-->C
A-->B-->C-->D1
A-->B-->C-->D2
A-->B-->F
A-->B-->F-->G1
A-->B-->F-->G2
A-->B-->F-->G3
A-->B-->M
A-->B-->M-->S1
A-->R
A-->R-->T
A-->U
L
L-->X
L-->X-->Y
L-->X-->Y-->Z

想法:

  • 使用“列标记”来跟踪 Activity 列
  • 如果新值位于某列,且列值较大,则追加
  • 如果具有相同的列值,则删除最后一个值,然后追加
  • 如果列值较小,请在追加之前删除新列值之外的所有当前值

注意:Test.xlsx 包含问题中所述的值。

关于java - 如何使用 Apache POI 解析保存在 Excel 文件中的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31084309/

相关文章:

java - java中如何将函数传递给方法参数

java - 如何从 maps.googleapis 获取 3 点之间的方向

java - Android Facebook SDK - java.lang.NoClassDefDefFoundError

vba - Excel VBA - 根据值比较工作表行

java - tomcat docker-compose 无法访问共享卷

excel - 如何在excel表格中屏蔽帐户?

c# - excel中的键盘快捷键csv文件列标题宽度自动调整

scala - TreeSet 映射后不遵守顺序

scala - 如何使用 GenericRecordBuilder 设置记录数组

scala - lazyMap其实不懒惰?