设置输出文件的列宽,防止文件过于丑陋
Sheet sheet = workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME); sheet.setColumnWidth(0, 40 * 256); sheet.setColumnWidth(1, 20 * 256); sheet.setColumnWidth(2, 20 * 256); sheet.setColumnWidth(3, 20 * 256);
实现标题行的第一个字符为红色,效果如图
//这边的0,1 就是设置第一个字符
Font font = workbook.createFont(); font.setColor(IndexedColors.RED.getIndex());
RichTextString store = workbook.getCreationHelper().createRichTextString(FileConstants.UPDATE_TEMPLATE_NAMES.get(Constants.ZERO)); store.applyFont(0, 1, font);
titleRow.createCell(Constants.ONE_INT).setCellValue(store);
判断如果是第一列的话 设置字体为红色
if (Constants.ZERO.equals(columnIndex)) { cellStyle.setFont(font); cell.setCellStyle(cellStyle); }
将文件上传oss保存,可以忽略
try (InputStream inputStream = new ByteArrayInputStream(out.toByteArray())) { aliyunOssUtil.uploadFile(ossFilePath, inputStream); }
完整代码如下:
private void uploadErrorFile(List<BatchUpdateStatusFileDTO> list, String fileBatchId) {
try (ByteArrayOutputStream out = new ByteArrayOutputStream();
Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet(FileConstants.ERROR_FILE_SHEET_NAME);
sheet.setColumnWidth(0, 40 * 256);
sheet.setColumnWidth(1, 20 * 256);
sheet.setColumnWidth(2, 20 * 256);
sheet.setColumnWidth(3, 20 * 256);
// 创建标题行
Row titleRow = sheet.createRow(0);
titleRow.createCell(Constants.ZERO).setCellValue(StringPool.EMPTY);
Font font = workbook.createFont();
font.setColor(IndexedColors.RED.getIndex());
RichTextString store = workbook.getCreationHelper().createRichTextString(FileConstants.UPDATE_TEMPLATE_NAMES.get(Constants.ZERO));
store.applyFont(0, 1, font);
titleRow.createCell(Constants.ONE_INT).setCellValue(store);
RichTextString number = workbook.getCreationHelper().createRichTextString(FileConstants.UPDATE_TEMPLATE_NAMES.get(Constants.ONE_INT));
number.applyFont(0, 1, font);
titleRow.createCell(Constants.TWO_INT).setCellValue(number);
RichTextString status = workbook.getCreationHelper().createRichTextString(FileConstants.UPDATE_TEMPLATE_NAMES.get(Constants.TWO_INT));
status.applyFont(0, 1, font);
titleRow.createCell(Constants.THREE_INT).setCellValue(status);
// 创建数据行
for (int i = 0; i < theResList.size(); i++) {
BatchUpdateStatusFileDTO data = theResList.get(i);
Row row = sheet.createRow(i + 1);
createCell(row, Constants.ZERO, data.getCheckResult(), workbook, font);
createCell(row, Constants.ONE_INT, data.getSalesStore(), workbook, font);
createCell(row, Constants.TWO_INT, data.getSalesOrder(), workbook, font);
createCell(row, Constants.THREE_INT, data.getSalesStatus(), workbook, font);
}
String ossFilePath = String.format(FileConstants.BATCH_UPDATE_ERROR_FILE_PATH, fileBatchId);
// 将Excel输出为InputStream
workbook.write(out);
try (InputStream inputStream = new ByteArrayInputStream(out.toByteArray())) {
aliyunOssUtil.uploadFile(ossFilePath, inputStream);
}
} catch (Exception e) {
log.error("---Modify the order status in batches, failed to upload an error file---", e);
}
}
private void createCell(Row row, int columnIndex, Object value, Workbook workbook, Font font) {
Cell cell = row.createCell(columnIndex);
if (value instanceof String) {
cell.setCellValue((String) value);
} else if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else {
cell.setCellValue(value.toString());
}
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setWrapText(Boolean.TRUE);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cell.setCellStyle(cellStyle);
if (Constants.ZERO.equals(columnIndex)) {
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
}