我有一个像这样的excel格式:
我有两个函数来填充数据。这个是填充细节。
public XSSFWorkbook getDetail(List<ResultDTO> ResultDTOList, XSSFWorkbook workBook,
String sheetName) throws DaoException {
XSSFSheet sheet = workBook.getSheet(sheetName);
// first row at 9
rowIdx = 9;
int count = 0;
for (ResultDTO dto : ResultDTOList) {
colIdx = 0;
count++;
// get row
row = sheet.getRow(rowIdx);
if (row == null) {
row = sheet.createRow(rowIdx);
}
row.setHeightInPoints(16.5F);
// No
callCreateCell(row, colIdx++).setCellValue(count);
// ItemNo
callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getItemNo()));
// ArtistName
callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getArtistName()));
colIdx++;
// ItemTitle
callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getItemTitle()));
colIdx++;
// Size
callCreateCell(row, colIdx++).setCellValue(dto.getSize());
colIdx++;
// Classification
callCreateCell(row, colIdx++).setCellValue(dto.getClassification());
colIdx++;
// Detail
callCreateCell(row, colIdx++).setCellValue(StringUtil.cutNewLineCharacter(dto.getPayDetail()));
// Technique
callCreateCell(row, colIdx++).setCellValue(dto.getTechnique());
// Uriage
callCreateCell(row, colIdx++).setCellValue(dto.getUriageWithoutTaxPrice());
row = null;
rowIdx++;
rowIdx++;
}
return workBook;
}
这个用来填充总数
public HSSFWorkbook getSum(UriageForm uriageForm, HSSFWorkbook workBook, String sheetName) {
HSSFSheet sheet = workBook.getSheet(sheetName);
CellStyle style1 = workBook.createCellStyle();
style1.setAlignment(CellStyle.ALIGN_RIGHT);
//set font size 14
Font font1 = workBook.createFont();
font1.setFontHeightInPoints((short)14);
style1.setFont(font1);
style1.setBorderLeft(CellStyle.BORDER_THIN);
style1.setBorderBottom(CellStyle.BORDER_MEDIUM);
Row row = sheet.getRow(20);
//SUM1
Cell cell2 = row.getCell(8);
cell2.setCellValue(uriageForm.getPrintNestedSize());
cell2.setCellStyle(style1);
//SUM2
Cell cell3 = row.getCell(9);
cell3.setCellValue(uriageForm.getPrintTxtShouhi());
cell3.setCellStyle(style1);
//SUM3
Cell cell4 = row.getCell(10);
cell4.setCellValue(uriageForm.getPrintTxtSum());
cell4.setCellStyle(style1);
//SUM4
Cell cell5 = row.getCell(12);
cell5.setCellValue(uriageForm.getPrintTxtSumAll());
cell5.setCellStyle(style1);
return workBook;
}
问题是,如果我有超过5条记录,数据将被填充到第20行,我的格式被破坏。我的预期结果是,如果有超过5条记录,那么它将为每个添加的记录添加2行(作为格式),并且我的SUM始终是工作表的最后2行。
我正在考虑将 SUM 性别删除到另一个工作表中,并将其复制到最后一个工作表中,直到详细信息完成。但是我遇到了一些问题:
如果有点混乱,我很抱歉。这是我第一次使用Java和POI,所以我非常期待你的帮助!谢谢大家!
添加CopRow
函数
private void copyRow(XSSFWorkbook workbook, XSSFSheet worksheet, int sourceRowNum, int destinationRowNum) {
XSSFRow newRow = worksheet.getRow(destinationRowNum);
XSSFRow sourceRow = worksheet.getRow(sourceRowNum);
if (newRow != null) {
worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);
newRow = worksheet.createRow(destinationRowNum);
} else {
newRow = worksheet.createRow(destinationRowNum);
}
// copy process
for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
Cell oldCell = sourceRow.getCell(i);
Cell newCell = newRow.createCell(i);
// if source cell is blank -> stop
if (oldCell == null) {
newCell = null;
continue;
}
//copy style
CellStyle newCellStyle = workbook.createCellStyle();
newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
newCell.setCellStyle(newCellStyle);
//copy cell type
newCell.setCellType(oldCell.getCellType());
//copy cell value
switch (oldCell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
newCell.setCellValue(oldCell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(oldCell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
newCell.setCellErrorValue(oldCell.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
newCell.setCellFormula(oldCell.getCellFormula());
break;
case Cell.CELL_TYPE_NUMERIC:
newCell.setCellValue(oldCell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
newCell.setCellValue(oldCell.getRichStringCellValue());
break;
}
}
//copy column merge
for (int i = 0; i < worksheet.getNumMergedRegions(); i++) {
CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {
CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),
(newRow.getRowNum() + (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())),
cellRangeAddress.getFirstColumn(), cellRangeAddress.getLastColumn());
worksheet.addMergedRegion(newCellRangeAddress);
}
}
}
在< code>getDetail函数中,添加以下代码:
int listSize = resultUriageWorkDTOList.size();
//add 2 rows for each record from 5th record
for (int i = 1; i <= (listSize - 5); i++) {
this.copyRow(workBook, sheet, 10, 12);
this.copyRow(workBook, sheet, 11, 13);
sheet.addMergedRegion(new CellRangeAddress(11,12,4,5));
}
资料来源:https://www.sukerou.com/2019/03/poi-apache-poi-tips.html
我需要一个关于下面场景的帮助。
如果这一行文本没有以方括号开头,我想把这一行连接到上面的一行。我可以读它在正常使用这个代码。我试着用String.StartsWith但是我搞不懂。 我正在寻找对此方法的更改,以使它以我想要的格式读取它,或者可能是一个将作用于我的并对此问题排序的方法。谢谢
问题内容: 我收到了JSON文件,但不知道如何读取。有转换器可以在其中生成漂亮的CSV文件,以便将其加载到MS Excel中吗?我不懂JSON,所以如果有人编写脚本或将我链接到可以完成此任务的脚本,那将非常棒。 我在http://json.bloople.net上找到了一些接近的东西,但是不幸的是,它是JSON到HTML。 编辑:jsonformat.com越来越近,但是它仍然不是CSV。 问题答
我正在尝试使用Jackson写json。它起作用了,而且据我所知,它的格式是正确的。但是,它仍然只出现在json文件中的一行中。这让它很难读懂。有没有办法让它多行,这样它就可读了? 代码: toJson文件中的结果: “{”name“:”div“,”attributes“:[{”type“:”text“,”info“:”two“},{”type“:”class“,”info“:”test“},{”
问题内容: 我正在创建一个HTML表,将在Excel中作为电子表格打开。我可以使用哪种HTML标记或CSS样式“讲述” Excel以将单元格的内容显示为文本? 问题答案: 您可以将格式应用于数字,文本,日期等的单元格。 请参阅我以前关于此的答案:HTML toExcel:如何告诉Excel将列视为数字? (已调整的代码段) 如果将CSS类添加到页面: 并在您的TD上拍那些课,行得通吗?