Java } cell.setCellValue(日期); cell.setCellStyle(dateCellStyle); }否则{ cell.setCellValue(value.toString()); } } } timer.stop(); //写入采集数据需要50分钟的时间 //日志:写入数据所用的时间54.567404175分钟 logger.info(“写入数据所用的时间”+timer.getTotalTimeSeconds()/60+“分钟”); //调整所有列的大小以适应内容大小 对于(int i=0;i

Java } cell.setCellValue(日期); cell.setCellStyle(dateCellStyle); }否则{ cell.setCellValue(value.toString()); } } } timer.stop(); //写入采集数据需要50分钟的时间 //日志:写入数据所用的时间54.567404175分钟 logger.info(“写入数据所用的时间”+timer.getTotalTimeSeconds()/60+“分钟”); //调整所有列的大小以适应内容大小 对于(int i=0;i,java,apache-poi,documentum,documentum-dfc,Java,Apache Poi,Documentum,Documentum Dfc,您可以尝试forkjoinPoll或使用jdk的stream parallel:),使用cpu的多核处理器。有关forkjoinpool示例,请参阅 public static List insertAttrValues(流、列表属性)引发RuntimeException{ if(流==null | |属性==null){ 抛出新的RuntimeException(“集合和属性”); } 最终整数大小=attributes.size(); 返回stream.parallel().map(项->{

您可以尝试forkjoinPoll或使用jdk的stream parallel:),使用cpu的多核处理器。有关forkjoinpool示例,请参阅

public static List insertAttrValues(流、列表属性)引发RuntimeException{
if(流==null | |属性==null){
抛出新的RuntimeException(“集合和属性”);
}
最终整数大小=attributes.size();
返回stream.parallel().map(项->{
Map Map=新LinkedHashMap(大小);
for(字符串属性:属性){
//map.put(属性,item.getString(属性));
}
返回图;
}).collect(Collectors.toList());
}

您可以进行以下改进:

  • 直接从
    IDfCollection
    填写POI结构,不要将采集数据复制到
    列表中
  • 使用
    collection.getTime(attribute)
    获取时间值,而不是对每条记录进行正则表达式解析。您可以使用
    collection.getAttrDataType(attribute)=IDfAttr.DF_TIME
    条件来解析值是否为TIME
  • 然后您可以直接使用date,而无需像这样解析:
    cell.setCellValue(collection.getTime(attribute.getDate())
  • 但数字也是一样,这样你就可以在excel表格中得到更好的结果。它意味着使用
    collection.getInt(属性)
    collection.getDouble(属性)
    而不是
    collection.getString(属性)
    。像
    IDfAttr.DM_INTEGER
    IDfAttr.DM_DOUBLE
    这样的常量在这里也会有所帮助
  • int last_row
    移动到for循环的外部,并在循环的内部执行
    last_row++
    。此时不需要调用
    工作表.getLastRowNum()
    。顺便说一句:驼峰案例名称
    lastRow<
    
    // avoided following method
    
    public static List<Map<String, Object>> insertAttrValues(IDfCollection dfCollection, List<String> attributes) throws DfException {
    
        if (dfCollection == null || attributes == null) {
            throw new MissingParameterException("collection and attributes");
        }
    
        List<Map<String, Object>> dataList = new ArrayList<>();
    
        while (dfCollection.next()) {
            Map<String, Object> map = new LinkedHashMap<>(attributes.size());
    
            for (String attribute: attributes) {
                map.put(attribute, dfCollection.getString(attribute));
            }
            dataList.add(map);
        }
    
        return dataList;
    }
    
    @SpringBootApplication
    public class ImmsClinicalReportApplication {
    
        public static void main(String[] args) {
            ApplicationContext applicationContext = SpringApplication.run(ImmsClinicalReportApplication.class, args);
            init(applicationContext);
        }
    
        private static void init(@NotNull ApplicationContext applicationContext) {
            ClinicalReportController clinicalReportController = (ClinicalReportController) applicationContext.getBean("clinicalReportController");
    
            IDfSession dfSession = null;
    
            try {
                dfSession = clinicalReportController.getSession();
                clinicalReportController.execute(dfSession);
                sendEmail(applicationContext, clinicalReportController);
            } catch (DfException | IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    clinicalReportController.cleanSession(dfSession);
                } catch (DfException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    @Controller("clinicalReportController")
    @PropertySource("classpath:application.properties")
    public class ClinicalReportController {
    
        private static final Logger logger = Logger.getLogger(ClinicalReportController.class);
    
        private final SessionHelper sessionHelper;
        private final DqlHelper dqlHelper;
        private final AppProperties appProperties;
    
        @Value("${report_path}")
        private String XLSX_FILE_PATH;
    
        private static final String[] moduleTypes = {
            "Clin Protocol", "Clin Investigator Brochure", "Clin Core Text",
            "Clin Process Documentation", "Clin Supporting Information"
        };
    
        @Autowired
        public ClinicalReportController(DqlHelper dqlHelper, SessionHelper sessionHelper, AppProperties appProperties) {
            this.dqlHelper = dqlHelper;
            this.sessionHelper = sessionHelper;
            this.appProperties = appProperties;
        }
    
        /**
         * Method that processes the report
         * @param dfSession dfSession
         * @throws DfException DfException
         * @throws IOException IOException
         */
        public void execute(IDfSession dfSession) throws DfException, IOException {
    
            StopWatch timer = new StopWatch();
    
            for (int i = 0; i < moduleTypes.length; i++) {
                // start timer
                timer.start();
                IDfCollection dfCollection = dqlHelper.query(dfSession, QueryConstant.immsQueries[i]);
    
                List<String> attributes = new ArrayList<>(dfCollection.getAttrCount());
    
                for (int j = 0; j < dfCollection.getAttrCount(); j++) {
                    attributes.add(dfCollection.getAttr(j).getName());
                }
    
                // stop timer
                timer.stop();
                // Each query takes 20 mins of time
                /* Sample query: select d.r_object_id, d.object_name, d.title,
                d.imms_extreleased_date, d.imms_extreleased_reason, d.imms_extreleaser,
                d.imms_protocol_number, d.imms_protocol_number_rep, d.keywords,
                d.imms_compound_number, d.imms_module_type, d.imms_prereleaser,
                d.imms_prereleased_date, f.r_folder_path from imms_document d,
                dm_folder f where d.i_folder_id=f.r_object_id and i_cabinet_id='0c0033ec80000700'
                and d.imms_module_type = 'Clin Protocol' and d.imms_extreleased_date >
                date('31/12/2016', 'dd/mm/yyyy') and f.r_folder_path is not nullstring enable (ROW_BASED)*/
                logger.info("Time taken to run query: " + QueryConstant.immsQueries[i] + ": " +
                        timer.getTotalTimeSeconds()/60 + " minutes");
    
                // List<Map<String, Object>> resultSet = ImmsUtils.insertAttrValues(dfCollection, attributes);
    
                if (i == 0) {
                    processReport(dfCollection, moduleTypes[i], attributes);
                } else {
                    updateReport(dfCollection, moduleTypes[i], attributes);
                }
                cleanCollection(dfCollection);
            }
        }
    
        /**
         * Method process for remaining queries/sheets
         * @param resultSet resultSet
         * @param objectType objectType
         * @param attributes attributes
         * @throws IOException IOException
         */
        private void updateReport(IDfCollection resultSet, String objectType, List<String> attributes) throws IOException, DfException {
            Workbook workbook = new XSSFWorkbook(new FileInputStream(XLSX_FILE_PATH));
            excelWriterAndOperateOutputStream(resultSet, objectType, workbook, attributes);
        }
    
        /**
         * Method that writes data to excel sheets
         * @param dfCollection dfCollection
         * @param sheet2 sheet2
         * @param workbook workbook
         * @param attributes 
     
         * Using collection directly. Not sure where is the issue in following method, writing data to sheet is also taking 50 minutes of time
         */
         private void writeToSheet(@NotNull IDfCollection dfCollection, Sheet sheet2, Workbook workbook, List<String> attributes) throws DfException {
            Sheet sheet;
            Row row;
    
            sheet = sheet2;
    
            Object[] values = new Object[attributes.size()];
            StopWatch timer = new StopWatch();
            
            // moved outside of loop 
            // TODO: avoid regex, use other logic 
            String dateRegex = "^([0-9]{4})/([0-1][0-9])/([0-3][0-9])\\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$";
            Pattern datePattern = Pattern.compile(dateRegex);
            // avoid SDF and Date and
            // TODO: use java.time - maybe LocalDate
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            Date date = null;
    
            CellStyle dateCellStyle = workbook.createCellStyle();
            dateCellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy/MM/dd HH:mm:ss"));
    
            timer.start();
            while (dfCollection.next()) {
                for (int i = 0; i < attributes.size(); i++) {
                    values[i] = dfCollection.getString(attributes.get(i));
                }
    
                int lastRow = sheet.getLastRowNum();
                row = sheet.createRow(++lastRow);
                int cellNum = 0;
    
    
                for (Object value: values) {
                    Cell cell = row.createCell(cellNum++);
                    if (datePattern.matcher(value.toString()).matches()) {
                        try {
                            date = simpleDateFormat.parse(value.toString());
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                        cell.setCellValue(date);
                        cell.setCellStyle(dateCellStyle);
                    } else {
                        cell.setCellValue(value.toString());
                    }
                }
            }
            timer.stop();
            // Taking 50 mins of time to write collection data
            // Log: Time taken for writing data 54.567404175 minutes
            logger.info("Time taken for writing data " + timer.getTotalTimeSeconds()/60 + " minutes");
    
    
            // Resize all columns to fit the content size
            for (int i = 0; i < attributes.size(); i++) {
                sheet.autoSizeColumn(i);
            }
        }
    
        /**
         * Method to create sheet, set fonts and colors
         * @param moduleType moduleType
         * @param workbook workbook
         * @return Sheet
         */
         private Sheet createSheet(String moduleType, Workbook workbook) {
            return workbook.createSheet(moduleType);
         }
    
        /**
         * Method to process first query/sheet
         * @param dfCollection dfCollection
         * @param moduleType moduleType
         * @param attributes attributes
         * @throws IOException IOException
         */
         private void processReport(IDfCollection dfCollection, String moduleType, List<String> attributes) throws IOException, DfException {
            // Create a Workbook - for xlsx
            Workbook workbook = new XSSFWorkbook();
    
            /*CreationHelper helps us create instances of various things like DataFormat,
              Hyperlink, RichTextString etc, in a format (HSSF, XSSF) independent way*/
            
            workbook.getCreationHelper();
    
            excelWriterAndOperateOutputStream(dfCollection, moduleType, workbook, attributes);
        }
    
        /**
         * Method that writes and saves data to file
         * @param resultSet resultSet
         * @param moduleType  moduleType
         * @param workbook workbook
         * @param attributes attributes
         * @throws IOException IOException
         */
        private void excelWriterAndOperateOutputStream(IDfCollection resultSet, String moduleType, Workbook workbook, List<String> attributes) throws IOException, DfException {
            Sheet sheet = createSheet(moduleType, workbook);
    
            CellStyle cellStyle = setFontsAndColors(workbook);
    
            // Create a Row
            Row headerRow = sheet.createRow(0);
            // Create cells
            for (int i = 0; i < attributes.size(); i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(attributes.get(i));
                cell.setCellStyle(cellStyle);
            }
    
            writeToSheet(resultSet, workbook.getSheet(moduleType), workbook, attributes);
            // Write the output to the file
            FileOutputStream fileOutputStream = new FileOutputStream(XLSX_FILE_PATH);
            workbook.write(fileOutputStream);
            // close the file
            fileOutputStream.close();
            // close the workbook
            workbook.close();
        }
    
        @NotNull
        private CellStyle setFontsAndColors(Workbook workbook) {
            CellStyle cellStyle = workbook.createCellStyle();
    
            // Create a Font for styling header cells
            Font headerFont = workbook.createFont();
            headerFont.setBold(false);
            headerFont.setFontHeightInPoints((short) 12);
            headerFont.setColor(IndexedColors.GREEN.getIndex());
            cellStyle.setFont(headerFont);
            return cellStyle;
       }
    
        /**
         * Get IDfSession object
         * @return IDfSession
         * @throws DfException DfException
         */
        public IDfSession getSession() throws DfException {
            IDfSession dfSession;
    
            IDfSessionManager sessionManager = sessionHelper.getDfSessionManager(appProperties.getRepository(), appProperties.getUsername(), appProperties.getPassword());
            dfSession = sessionManager.getSession(appProperties.getRepository());
            return dfSession;
        }
    
        /**
         * Clean IDfCollection
         * @param dfCollection dfCollection
         */
        public void cleanCollection(IDfCollection dfCollection) {
            dqlHelper.cleanup(dfCollection);
        }
    
        /**
         * Clean IDfSession
         * @param dfSession dfSession
         */
        public void cleanSession(IDfSession dfSession) throws DfException {
            sessionHelper.cleanSession(dfSession);
        }
        }
    
      public static List<Map<String, Object>> insertAttrValues(Stream<Object> stream, List<String> attributes) throws RuntimeException {
        if (stream == null || attributes == null) {
            throw new RuntimeException("collection and attributes");
        }
        final int size = attributes.size();
        return stream.parallel().map(item -> {
            Map<String, Object> map = new LinkedHashMap<>(size);
            for (String attribute : attributes) {
                //map.put(attribute, item.getString(attribute));
            }
            return map;
        }).collect(Collectors.toList());
    }
    
    @Component
    public class AppProperties {
    
       /**
        *other fields
        */
    
        @Getter
        @Value("${included_attributes}")
        private String[] includedAttributes;
    
    }
    
    public void execute(IDfSession dfSession) throws DfException, IOException {
    
        StopWatch timer = new StopWatch();
    
        for (int i = 0; i < moduleTypes.length; i++) {
            // start timer
            timer.start();
            IDfCollection dfCollection = dqlHelper.query(dfSession, QueryConstant.immsQueries[i]);
            // stop timer
            timer.stop();
            logger.info("Time taken to run query: " + QueryConstant.immsQueries[i] + ": " +
                    timer.getTotalTimeSeconds() + " seconds");    
            // attributes to be added
            List<String> attributes = new ArrayList<>();
            // Get included attributes as list
            List<String> includedAttributes = Arrays.asList(appProperties.getIncludedAttributes());
    
            for (int j = 0; j < dfCollection.getAttrCount(); j++) {
                // check for the attribute in included attributes and add if exists
                if (hasAttribute(includedAttributes, dfCollection.getAttr(j).getName())) {
                    attributes.add(dfCollection.getAttr(j).getName());
                }
            }
    
    
            if (i == 0) {
                processReport(dfCollection, moduleTypes[i], attributes);
            } else {
                updateReport(dfCollection, moduleTypes[i], attributes);
            }
            cleanCollection(dfCollection);
        }
    }
    
    public static boolean hasAttribute(@NotNull List<String> attributes, String attribute) {
        for(String attr : attributes){
            if(attribute.contains(attr)){
                return true;
            }
        }
        return false;
    }
    
    private void writeToSheet(@NotNull IDfCollection dfCollection, Sheet sheet2,
                                  @NotNull Workbook workbook, List<String> attributes) throws DfException {
            Sheet sheet;
            Row row;
    
            sheet = sheet2;
    
            StopWatch timer = new StopWatch();
    
            String dateRegex = "^([0-9]{4})/([0-1][0-9])/([0-3][0-9])\\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$";
            Pattern datePattern = Pattern.compile(dateRegex);
    
            DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    
            CellStyle dateCellStyle = workbook.createCellStyle();
            dateCellStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy/MM/dd HH:mm:ss"));
    
            int lastRow = 0;
    
            timer.start();
            while (dfCollection.next()) {
                row = sheet.createRow(++lastRow);
                int cellNum = 0;
    
                for (String attribute : attributes) {
                    Object value = dfCollection.getString(attribute);
    
                    Cell cell = row.createCell(cellNum++);
    
                    if (datePattern.matcher(value.toString()).matches()) {
                        cell.setCellValue(LocalDateTime.parse(value.toString(), timeFormatter));
                        cell.setCellStyle(dateCellStyle);
                    } else {
                        cell.setCellValue(value.toString());
                    }
                }
            }
            timer.stop();
            logger.info("Time taken for writing data " + timer.getTotalTimeSeconds()/60 + " minutes");
    
    
            // Resize all columns to fit the content size
            for (int i = 0; i < attributes.size(); i++) {
                sheet.autoSizeColumn(i);
            }
        }