package org.openlca.io.xls.process.output;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.openlca.core.database.IDatabase;
import org.openlca.core.database.ProcessDao;
import org.openlca.core.model.Process;
import org.openlca.core.model.Version;
import org.openlca.core.model.descriptors.ProcessDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
/**
* Exports a set of processes and related reference data to Excel files in a
* given directory.
*/
public class ExcelExport implements Runnable {
private Logger log = LoggerFactory.getLogger(getClass());
private final File dir;
private final IDatabase database;
private final List<ProcessDescriptor> descriptors;
public ExcelExport(File dir, IDatabase database,
List<ProcessDescriptor> descriptors) {
this.dir = dir;
this.database = database;
this.descriptors = descriptors;
}
@Override
public void run() {
try {
if (!dir.exists())
dir.mkdirs();
ProcessDao dao = new ProcessDao(database);
for (ProcessDescriptor descriptor : descriptors) {
Process process = dao.getForId(descriptor.getId());
if (process == null || process.getDocumentation() == null) {
log.warn("process {} was null or has no documentation: "
+ "not exported", descriptor);
continue;
}
export(process);
}
} catch (Exception e) {
log.error("failed to export process data sets to Excel", e);
}
}
private void export(Process process) throws Exception {
Workbook workbook = new SXSSFWorkbook();
Config config = new Config(workbook, database, process);
writeSheets(config);
String fileName = process.getRefId() + "_"
+ Version.asString(process.getVersion()) + ".xlsx";
File file = new File(dir, fileName);
try (FileOutputStream fos = new FileOutputStream(file)) {
workbook.write(fos);
}
}
private void writeSheets(Config config) {
InfoSheet.write(config);
IOSheet.writeInputs(config);
IOSheet.writeOutputs(config);
ParameterSheet.write(config);
AllocationSheet.write(config);
ModelingSheet.write(config);
AdminInfoSheet.write(config);
// reference data
FlowSheets.write(config);
UnitSheet.write(config);
UnitGroupSheet.write(config);
FlowPropertySheet.write(config);
ActorSheet.write(config);
SourceSheet.write(config);
LocationSheet.write(config);
}
}