インタフェース・アダプティブ・モードを使用したレポートのエクスポート
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
}
public class Row {
private String indicator;
private Cell[] cells = null; //
private boolean formular = false;
}
public class Sheet {
private String code; //
private String name; //Sheet
private boolean clone = false; //
}
エクスポートの段階的な分解
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);
}
}