заметки про JXLS (шаблоны Excel)

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
Для создания отчетов в Excel существует множество подходов (изложу по порядку убывания проблем с поддержкой) :
- ручной - вызов COM
- ручной - формирования XML
- ручной - использование POI
- шаблонный: jxls, jasperreports,...

рассмотрю по топику - JXLS
для этого движка существуют две реинкарнации и отличаются они содиржимым шаблона
1.х -
2.x -
за скобками останется jvm , в демках блоки try описаны в начинаетс это с версии 1.7, но сами либы, вполне возможно, будут работать и в 1.6 (пока не тестил)
в jxl 1.х поддерживался способ описания , кот. в 2.х я не нашел рабочим (а жаль, для меня так удобнее), в 2.х описание сместилось в каменты
основнре неудобство - надо описывать lastCell (для area и инструкций), мне пришлось долго канапатиться с вложенной группировкой (на версии 1.х она делается очевидным образом), в 3-х каментах пришлось вводить "локальные" переменные
в демках есть группировка, но она одноуровневая
сравниваем и

Шаблоны можно сосздавать и в LibraOffice (ЛО), но там могут всплыть особенности, ЛО нормально отображает шаблон созданный в МСО, а вот наоборот - уже нюансы, и отображение в МСО каментов - это ужос (плохая наглядность/управляемость)
МСО:
1533909141777.png

ЛО:
1533909199213.png

это редактированный в МСО шаблон
лаги с выводом после генерации, отображение в ЛО:
1533909376012.png

в МСО будет норм
 
  • Нравится
Реакции: Vertigo

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 982
611
BIT
444
что делает шаблон, что впоследствии подлежит коррекции - создает пустые строки, коррекция:
Java:
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GroupingDemo {
    private static Logger logger = LoggerFactory.getLogger(GroupingDemo.class);

    public static void main(String[] args) throws ParseException, IOException {
        logger.info("Running Grouping demo");
        List<PriceItem> priceItems = generateSampleEmployeeData();
        InputStream is = null;
        try{
            is=new FileInputStream( "src/org/jxls/demo/guide/grouping_template_price.xlsx");
            OutputStream os = null;
            try{
                os=new FileOutputStream("target/grouping_output.xlsx");
                Map beans=new HashMap();
                beans.put("priceItems",priceItems);

                Context context = new Context();
                context.putVar("priceItems", priceItems);
                JxlsHelper.getInstance().processTemplate(is, os, context);
                os.close();
                InputStream isPOI=new FileInputStream("target/grouping_output.xlsx");
                XSSFWorkbook wb=postProcess(isPOI);
                isPOI.close();
                os=new FileOutputStream("target/grouping_output.xlsx");
                wb.write(os);
            }finally {
                if(os!=null)os.close();
            }
        }finally{
            if(is!=null)is.close();
        }
/*
        try(InputStream is = GroupingDemo.class.getResourceAsStream("grouping_template.xlsx")) {
            try (OutputStream os = new FileOutputStream("target/grouping_output.xlsx")) {
                Context context = new Context();
                context.putVar("employees", employees);
                JxlsHelper.getInstance().processTemplate(is, os, context);
            }
        }
*/
    }

    public static XSSFWorkbook postProcess(InputStream is) throws IOException {
        XSSFWorkbook wb = null;
        XSSFSheet sheet=null;
        wb= new XSSFWorkbook(is);
        for(int i=0;i<wb.getNumberOfSheets();i++){
            sheet=wb.getSheetAt(i);
            removeBlank(sheet);
        }

        return wb;
    }

    private static void removeBlank(XSSFSheet sheet) {
        int cnt=sheet.getLastRowNum();
        System.out.println("Row Count:"+cnt);
        for(int i=0;i<sheet.getLastRowNum(); i++){
            if(isEmpty(sheet.getRow(i))){
                System.out.println("Del Row:"+i);
                int diff=1;
                //if (sheet.getRow(i)==null)diff=2;
                sheet.shiftRows(i + diff, sheet.getLastRowNum(), -diff);
                i--;//Adjusts the sweep in accordance to a row removal
            }
            if (sheet.getRow(i)==null) System.out.println("Row not checked:"+i);
        }
    }

    private static boolean isEmpty(XSSFRow row) {
        if (row==null || row.getCell(0)==null)return true;
        String val=row.getCell(0).getStringCellValue();
        if (val==null || val.isEmpty())return true;
        return false;
    }

    public static List<PriceItem> generateSampleEmployeeData() throws ParseException {
        List<PriceItem> priceItems = new ArrayList<>();
смотрим removeBlank
 
  • Нравится
Реакции: Vertigo
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!