Search in sources :

Example 1 with TitleMeta

use of com.jeesuite.common2.excel.model.TitleMeta in project jeesuite-libs by vakinge.

the class ExcelBeanHelper method doCacheClass.

/**
 * @param clazz
 * @param canonicalName
 * @return
 * @throws IntrospectionException
 */
private static synchronized void doCacheClass(Class<?> clazz, String canonicalName) throws Exception {
    if (aliasPropertyDescriptorCache.containsKey(canonicalName))
        return;
    Map<String, PropertyDescriptor> map = new HashMap<>();
    Map<String, PropertyDescriptor> aliasMap = new HashMap<>();
    List<TitleMeta> titleMetas = new ArrayList<>();
    BeanInfo srcBeanInfo = Introspector.getBeanInfo(clazz);
    PropertyDescriptor[] descriptors = srcBeanInfo.getPropertyDescriptors();
    Map<String, TitleMeta> parentMap = new HashMap<>();
    int maxRow = 1;
    for (PropertyDescriptor descriptor : descriptors) {
        String name = descriptor.getName();
        if ("class".equals(name))
            continue;
        Method readMethod = descriptor.getReadMethod();
        Method writeMethod = descriptor.getWriteMethod();
        if (readMethod == null)
            try {
                readMethod = clazz.getMethod("get" + name.substring(0, 1).toUpperCase() + name.substring(1));
                descriptor.setReadMethod(readMethod);
            } catch (NoSuchMethodException | SecurityException e) {
            }
        if (writeMethod == null)
            try {
                writeMethod = clazz.getMethod("set" + name.substring(0, 1).toUpperCase() + name.substring(1), descriptor.getPropertyType());
                descriptor.setWriteMethod(writeMethod);
            } catch (NoSuchMethodException | SecurityException e) {
            }
        if (readMethod != null || writeMethod != null) {
            map.put(descriptor.getName(), descriptor);
            // 
            TitleCell annotation = null;
            try {
                annotation = clazz.getDeclaredField(name).getAnnotation(TitleCell.class);
            } catch (NoSuchFieldException e) {
                annotation = clazz.getSuperclass().getDeclaredField(name).getAnnotation(TitleCell.class);
            }
            if (annotation != null) {
                aliasMap.put(annotation.name().trim(), descriptor);
                TitleMeta cell = new TitleMeta(annotation.name());
                cell.setValueType(annotation.type());
                if (StringUtils.isBlank(annotation.parentName())) {
                    cell.setColumnIndex(annotation.column());
                    cell.setRowIndex(annotation.row());
                    titleMetas.add(cell);
                } else {
                    TitleMeta cellParent = parentMap.get(annotation.parentName());
                    if (cellParent == null) {
                        cellParent = new TitleMeta(annotation.parentName());
                        cellParent.setValueType(annotation.type());
                        cellParent.setColumnIndex(annotation.column());
                        parentMap.put(annotation.parentName(), cellParent);
                        titleMetas.add(cellParent);
                    }
                    cell.setColumnIndex(annotation.column());
                    cell.setRowIndex(annotation.row());
                    cellParent.addChildren(cell);
                    maxRow = annotation.row() > maxRow ? annotation.row() : maxRow;
                }
            }
        }
    }
    ExcelMeta excelMeta = new ExcelMeta(clazz, titleMetas, maxRow);
    titleCellBeanCache.put(canonicalName, excelMeta);
    aliasPropertyDescriptorCache.put(canonicalName, aliasMap);
}
Also used : PropertyDescriptor(java.beans.PropertyDescriptor) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) BeanInfo(java.beans.BeanInfo) TitleCell(com.jeesuite.common2.excel.annotation.TitleCell) ArrayList(java.util.ArrayList) Method(java.lang.reflect.Method) ExcelMeta(com.jeesuite.common2.excel.model.ExcelMeta) TitleMeta(com.jeesuite.common2.excel.model.TitleMeta)

Example 2 with TitleMeta

use of com.jeesuite.common2.excel.model.TitleMeta in project jeesuite-libs by vakinge.

the class ExcelWriter method write.

/**
 * 将数据写入excel文件
 *
 * @param list 数据列表
 * @param <T>  泛型
 * @return 写入结果
 */
public <T> boolean write(List<T> list, Class<T> clazz) {
    ExcelMeta excelMeta = ExcelBeanHelper.getExcelMeta(clazz);
    try {
        Sheet sheet = workbook.createSheet(this.sheetName);
        sheet.setDefaultColumnWidth(15);
        CellStyle titleStyle = workbook.createCellStyle();
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        titleStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        // 下边框
        titleStyle.setBorderBottom(BorderStyle.THIN);
        titleStyle.setBorderLeft(BorderStyle.THIN);
        Font font = workbook.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 13);
        titleStyle.setFont(font);
        // 列值类型
        Class<?>[] cellValueTypes = new Class<?>[excelMeta.getTitleColumnNum()];
        // 写标题
        for (int i = 1; i <= excelMeta.getTitleRowNum(); i++) {
            Row excelRow = sheet.createRow(i - 1);
            for (int j = 1; j <= excelMeta.getTitleColumnNum(); j++) {
                TitleMeta titleMeta = excelMeta.getTitleMeta(i, j);
                Cell cell = excelRow.createCell(j - 1);
                cell.setCellValue(titleMeta == null ? "" : titleMeta.getTitle());
                cell.setCellStyle(titleStyle);
                cellValueTypes[j - 1] = titleMeta.getValueType();
            }
        }
        // 合并表头
        // sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 8));
        // sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
        mergeColumns(sheet, titleStyle);
        mergeRows(sheet, titleStyle, excelMeta);
        // 行数
        int rowsCount = sheet.getPhysicalNumberOfRows();
        // 冻结表头
        // sheet.createFreezePane(0, rowsCount - 1);
        // 写入内容
        List<Object[]> rows = ExcelBeanHelper.beanToExcelValueArrays(list, clazz);
        // int colsCount = sheet.getRow(0).getPhysicalNumberOfCells();
        for (int i = 0; i < rows.size(); i++) {
            Row excelRow = sheet.createRow(i + rowsCount);
            Object[] vals = rows.get(i);
            for (int j = 0; j < vals.length; j++) {
                Cell cell = excelRow.createCell(j);
                if (cellValueTypes[j] == int.class || cellValueTypes[j] == Integer.class) {
                    cell.setCellValue(vals[j] == null ? 0f : Integer.parseInt(vals[j].toString()));
                } else if (cellValueTypes[j] == float.class || cellValueTypes[j] == Float.class || cellValueTypes[j] == double.class || cellValueTypes[j] == Double.class || cellValueTypes[j] == BigDecimal.class) {
                    cell.setCellValue(vals[j] == null ? 0d : Double.parseDouble(vals[j].toString()));
                } else {
                    cell.setCellValue(vals[j] == null ? "" : vals[j].toString());
                }
            }
        }
        workbook.write(outputStream);
        return true;
    } catch (IOException e) {
        LOG.error("流异常", e);
    } catch (Exception e) {
        LOG.error("其他异常", e);
    } finally {
    }
    return false;
}
Also used : ExcelMeta(com.jeesuite.common2.excel.model.ExcelMeta) IOException(java.io.IOException) Font(org.apache.poi.ss.usermodel.Font) InvalidFormatException(org.apache.poi.openxml4j.exceptions.InvalidFormatException) IOException(java.io.IOException) CellStyle(org.apache.poi.ss.usermodel.CellStyle) Row(org.apache.poi.ss.usermodel.Row) TitleMeta(com.jeesuite.common2.excel.model.TitleMeta) Sheet(org.apache.poi.ss.usermodel.Sheet) Cell(org.apache.poi.ss.usermodel.Cell)

Example 3 with TitleMeta

use of com.jeesuite.common2.excel.model.TitleMeta in project jeesuite-libs by vakinge.

the class PersonSalaryInfo method main.

public static void main(String[] args) {
    List<TitleMeta> titleCellBeans = new ArrayList<>();
    Field[] fields = PersonSalaryInfo.class.getDeclaredFields();
    Map<String, TitleMeta> parentMap = new HashMap<>();
    int index = 0, subIndex = 0;
    for (Field field : fields) {
        if (!field.isAnnotationPresent(TitleCell.class))
            continue;
        TitleCell annotation = field.getAnnotation(TitleCell.class);
        TitleMeta cell = new TitleMeta(annotation.name());
        if (StringUtils.isBlank(annotation.parentName())) {
            cell.setColumnIndex(++index);
            titleCellBeans.add(cell);
        } else {
            TitleMeta cellParent = parentMap.get(annotation.parentName());
            if (cellParent == null) {
                subIndex = index;
                cellParent = new TitleMeta(annotation.parentName());
                cellParent.setColumnIndex(++index);
                parentMap.put(annotation.parentName(), cellParent);
                titleCellBeans.add(cellParent);
            }
            cell.setColumnIndex(++subIndex);
            cell.setRowIndex(1);
            cellParent.addChildren(cell);
        }
    }
    for (TitleMeta cell : titleCellBeans) {
        System.out.println(cell);
        if (cell.getChildren().size() > 0) {
            for (TitleMeta child : cell.getChildren()) {
                System.out.println("--" + child);
            }
        }
    }
}
Also used : Field(java.lang.reflect.Field) HashMap(java.util.HashMap) TitleCell(com.jeesuite.common2.excel.annotation.TitleCell) ArrayList(java.util.ArrayList) TitleMeta(com.jeesuite.common2.excel.model.TitleMeta)

Aggregations

TitleMeta (com.jeesuite.common2.excel.model.TitleMeta)3 TitleCell (com.jeesuite.common2.excel.annotation.TitleCell)2 ExcelMeta (com.jeesuite.common2.excel.model.ExcelMeta)2 ArrayList (java.util.ArrayList)2 HashMap (java.util.HashMap)2 BeanInfo (java.beans.BeanInfo)1 PropertyDescriptor (java.beans.PropertyDescriptor)1 IOException (java.io.IOException)1 Field (java.lang.reflect.Field)1 Method (java.lang.reflect.Method)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 InvalidFormatException (org.apache.poi.openxml4j.exceptions.InvalidFormatException)1 Cell (org.apache.poi.ss.usermodel.Cell)1 CellStyle (org.apache.poi.ss.usermodel.CellStyle)1 Font (org.apache.poi.ss.usermodel.Font)1 Row (org.apache.poi.ss.usermodel.Row)1 Sheet (org.apache.poi.ss.usermodel.Sheet)1