インタフェース・アダプティブ・モードを使用したレポートのエクスポート

9915 ワード

目次


生産ではレポートのエクスポート機能によく遭遇します.レポートの作成方法を一歩一歩分析してみましょう.

cell+row+sheet


1. cell:レポートの最小単位値はcell:値、タイプ、スタイル、生産でresourceに調整済みのスタイルを入れることができます.そこで、excelに値を追加します.より良い値を追加するために、cellごとにインデックス属性を追加します.
public class Cell {
    private Object value;
    private int colIndex; // 
    private String dataType; //int, string, date, double
}
  • はcellからなるrow行であり、各rowにはcellがあり、表示されないので
  • である.
    public class Row {
        private String indicator;
        private Cell[] cells = null; // 
        private boolean formular = false; 
    }
  • rowによってまたsheetが構成され、多くのsheetがあるかもしれませんが、もちろん1年に12ヶ月あるので、1つのexcelファイルに12のsheetが含まれているので、私たちは当然各sheetのcode+名前+が
  • コピーされるかどうかを構成します.
    public class Sheet {
        private String code; // 
        private String name; //Sheet 
        private boolean clone = false; // 
    }

    エクスポートの段階的な分解

  • まずエクスポート動作を抽象化し、エクスポートはsheetであり、sheetはデータセット
  • を必要とする.
    public interface IExcelReportSource { 
         *  Sheet   
        public Sheet[] getSheets(Map context);
    
         *  Sheet      
        public List getSheetRows(Map context, Sheet sheet);
    } 

    この場合、excelの中にはsheetしか必要ないものもあれば、具体的なデータも必要なものもあるので、私の実装クラスは、インタフェースのいくつかの方法の実装だけが必要なので、インタフェースアダプタを書く必要があります.
    public abstract class AbstractReportSourceService implements IExcelReportSource {
      @Override
        public Sheet[] getSheets(Map context) {
         //         sheet
    }
    
    }

    この抽象クラス書き換えのgetsheets()は共通であり,具体的な実装クラスは複数見られる.
    @Component("LSHROSWeekReportSource")
    public class souce1  extends AbstractReportSourceService {
     @Override
        public List getSheetRows(Map context, Sheet sheet) {
                                }
    }

    または
    @Component("SaleMonthlyReportSource")
    public class source2  extends AbstractReportSourceService {
        @Override
        public List getSheetRows(Map context, Sheet sheet) {
    
             }
    
    }

    2. エクスポートされたレポートExcelReportContextには、テンプレート名+ファイル名+エクスポートアクション+ストップセルが必要です
    public class ExcelReportContext {
        private String template; //  
        private String fileName;  //  
        private Map params = new HashMap<>();//    
        private IExcelReportSource source;
        private boolean staticSheet;   
        private int clonableSheet = 0;
        private int startCellIndex = 0;
        private int endCellIndex = 0;
        private boolean autoRowExtended = false;
     public ExcelReportContext addParam(String name, Object value) {
            params.put(name, value); 
            return this;
        }
    
        }
    

    3. エクスポートされたサービスは抽象的で、
    public interface IExcelReportService {
    
         *  Excel outputStream        
        public void export(ExcelReportContext context, OutputStream os) throws Exception;
    
    
         *  Excel Response       
        public void export(ExcelReportContext context, HttpServletResponse response) throws Exception;
    }

    実装クラス
    @Component("ExcelReportService")
    public class ExcelReportServiceImpl implements IExcelReportService { 
        @Override
        public void export(ExcelReportContext context, OutputStream os) throws Exception {
            XSSFWorkbook xWorkbook = this.getWorkbook(context); 
            xWorkbook.write(os);
    
            xWorkbook = null;
        }

    実際の使用


    注入されたresourceに基づいて、データセットがどこから来るかを決定します.
    @Service
    @Transactional
    public class ReportServiceImpl implements ReportService {
        private Logger logger = LoggerFactory.getLogger(ReportServiceImpl.class);
    
        @Autowired
        private IExcelReportService excelReportService;
    
        @Resource(name = "SaleMonthlyReportSource")
        private IExcelReportSource source1;
    
        @Resource(name = "LSHROSWeekReportSource")
        private IExcelReportSource source2;
    
      public void getSalesManagerReport(String username, String year, HttpServletResponse response) {
            try {
                ExcelReportContext context = new ExcelReportContext();
                context.setTemplate("templates/ .xlsx")
                        .setFileName(year + " .xlsx")
                        .setSource(saleMonthlyReportSource)
                        .setStaticSheet(false)
                        //.setClonableSheet(2)     sheet( sheet)
                        .addParam("username", username).addParam("year", year);
    
                excelReportService.export(context, response);
            } catch (Exception exc) {
                logger.error(" [ ] 。", exc);
            }
        }