@Test
    public void complexHeaderRead() {
        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // Specify the class to read, then read the first sheet
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
                // Set to 1 here because the header is one row. For multi-row headers, set to other values.
                // You can also omit this, as the default behavior will parse based on DemoData, which does not specify a header, meaning the default is 1 row.
                .headRowNumber(1).doRead();
    }
Multi-row header

<p>
1. Create an entity class corresponding to the Excel data structure. Refer to {@link DemoData}.
<p>
2. Since EasyExcel reads Excel files row by row, you need to create a callback listener for each row. Refer to {@link DemoDataListener}.
<p>
3. Set the `headRowNumber` parameter, then read. Note that if `headRowNumber` is not specified,
the number of rows will be determined by the number of headers in the `@ExcelProperty#value()` of the class you provide.
If no class is provided, the default is 1. Of course, if you specify `headRowNumber`, it will be used regardless of whether a class is provided.
fastexcel-test/src/test/java/cn/idev/excel/test/demo/read/ReadTest.java