此外,有些单元格有多行,每行都可能有不同的样式(超链接、背景色、纯文本),这在apache poi library for java中是可能的吗?找不到任何相关信息。
我使用java 8与apache poi 4.1.2。目前管理创建excel与每一行有一个单元格在每一列与特定类型。
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("sheet");
Row header = sheet.createRow(0);
CellStyle hlinkStyle = workbook.createCellStyle();
CellStyle cellStyle = workbook.createCellStyle();
CellStyle dateStyle = workbook.createCellStyle();
CellStyle numberStyle = workbook.createCellStyle();
CellStyle rowStyle = workbook.createCellStyle();
rowStyle.setWrapText(true);
setHeaderAndStyles(workbook, hlinkStyle, dateStyle, numberStyle, cellStyle);
createHeaders(workbook, sheet, header, null);
int[] rowNum = {1};
data.forEach(ele -> {
Row row = sheet.createRow(rowNum[0]);
row.setRowStyle(rowStyle);
int cellIdx = 0;
// name
cell = row.createCell(cellIdx++);
cell.setCellValue(ele.getName());
cell.setCellStyle(cellStyle);
// ID
cell = row.createCell(cellIdx++);
cell.setCellValue(ele.getId());
cell.setCellStyle(cellStyle);
// hyper link
cell = row.createCell(cellIdx++);
Hyperlink link = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
link.setAddress(CONST_URL);
cell.setCellValue(ele.getHyperLinkText());
cell.setHyperlink(link);
cell.setCellStyle(hlinkStyle);
// need to create more cells here with background color
// desc
cell = row.createCell(cellIdx);
cell.setCellValue(ele.getDesc());
cell.setCellStyle(cellStyle);
row.getCell(cellIdx).setCellStyle(rowStyle); // for cells with multiple lines.
// need to create more cells here with plain text
rowNum[0]++;
});
}
谢啦
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet();
// Creating all needed cellStyles
XSSFCellStyle noBottomGridLine = workbook.createCellStyle();
noBottomGridLine.setBorderBottom(BorderStyle.THIN);
noBottomGridLine.setBottomBorderColor(IndexedColors.WHITE.index);
XSSFCellStyle noTopGridLine = workbook.createCellStyle();
noTopGridLine.setBorderTop(BorderStyle.THIN);
noTopGridLine.setTopBorderColor(IndexedColors.WHITE.index);
XSSFCellStyle noVerticalGridLine = workbook.createCellStyle();
noVerticalGridLine.setBorderTop(BorderStyle.THIN);
noVerticalGridLine.setTopBorderColor(IndexedColors.WHITE.index);
noVerticalGridLine.setBorderBottom(BorderStyle.THIN);
noVerticalGridLine.setBottomBorderColor(IndexedColors.WHITE.index);
XSSFFont hlinkFont = workbook.createFont();
hlinkFont.setUnderline(Font.U_SINGLE);
hlinkFont.setColor(IndexedColors.BLUE.getIndex());
XSSFCellStyle hlinkStyle = workbook.createCellStyle();
hlinkStyle.setFont(hlinkFont);
XSSFCellStyle coloredStyle = workbook.createCellStyle();
coloredStyle.setFillForegroundColor(IndexedColors.RED.index);
coloredStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
XSSFCellStyle alignedText = workbook.createCellStyle();
alignedText.setVerticalAlignment(VerticalAlignment.TOP);
// Creating merged regions for columns one and two
sheet.addMergedRegion(new CellRangeAddress(0, 5, 0, 0));
sheet.addMergedRegion(new CellRangeAddress(0, 5, 1, 1));
// Removing gridlines from columns three four and five
for (int i = 2 ; i < 5 ; ++i) {
for (int j = 0 ; j < 6 ; ++j) {
XSSFRow r = sheet.getRow(j);
if (r == null) r = sheet.createRow(j);
if (j == 0) {
r.createCell(i, CellType.STRING).setCellStyle(noBottomGridLine);
} else if (j == 5){
r.createCell(i, CellType.STRING).setCellStyle(noTopGridLine);
} else {
r.createCell(i, CellType.STRING).setCellStyle(noVerticalGridLine);
}
}
}
// Resizing columns
for (int j = 0 ; j < 6 ; ++j) sheet.setColumnWidth(j, 125*50);
// First column
sheet.getRow(0).createCell(0, CellType.STRING).setCellValue("Name");
sheet.getRow(0).getCell(0).setCellStyle(alignedText);
// Second column
sheet.getRow(0).createCell(1, CellType.NUMERIC).setCellValue("112233");
sheet.getRow(0).getCell(1).setCellStyle(alignedText);
// Third column
XSSFCell hyperlinkCell = sheet.getRow(0).getCell(2);
hyperlinkCell.setCellValue("hyperlink text");
XSSFHyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("https://www.youtube.com/watch?v=mI_y8h22c_o");
hyperlinkCell.setHyperlink(hyperlink);
hyperlinkCell.setCellStyle(hlinkStyle);
XSSFCell backGroundColoredCell = sheet.getRow(2).getCell(2);
backGroundColoredCell.setCellValue("Colored Cell");
backGroundColoredCell.setCellStyle(coloredStyle);
// Fourth column
sheet.getRow(0).getCell(3).setCellValue("Team");
sheet.getRow(1).getCell(3).setCellValue("Title");
sheet.getRow(2).getCell(3).setCellValue("New Team");
sheet.getRow(3).getCell(3).setCellValue("New Team");
// Fifth column
sheet.getRow(0).getCell(4).setCellValue("Full Team description");
sheet.getRow(1).getCell(4).setCellValue("Full Title Description");
sheet.getRow(2).getCell(4).setCellValue("Origin");
sheet.getRow(3).getCell(4).setCellValue("Code");
// Saving Workbook
FileOutputStream outputStream = new FileOutputStream("D:\\Desktop\\test-excel.xlsx");
workbook.write(outputStream);
workbook.close();
outputStream.close();
输出:
当使用. xlsx excel文件时(这意味着使用XSSF
Apache Poi对象,看看这篇文章中XSSF
和HSSF
Apache Poi对象之间的区别),您可以使用XSSFRichTextString
来填充XSSFcell
中的一些格式化文本。使用XSSFRichTextString
,您可以添加与自定义XSSFFont
相关联的新文本,并使用\n
字符来开始新行(如果您已经在XSSFCellStyle
的XSSFCellStyle
上调用了CellStyle#setWrapTest(true),如这里所讨论的)。
这里是一个例子:
XSSFRichTextString richValue = new XSSFRichTextString();
XSSFFont italicBoldFont = workbook.createFont();
italicBoldFont.setBold(true);
italicBoldFont.setItalic(true);
XSSFFont onlyBoldFont = workbook.createFont();
onlyBoldFont.setBold(true);
richValue.append("First text", italicBoldFont);
richValue.append("\nSecond text", onlyBoldFont);
XSSFCell cell = workbook.getSheetAt(0).createRow(0).createCell(0, CellType.STRING);
XSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setWrapText(true);
cell.setCellStyle(cellStyle);
cell.setCellValue(richValue);
使用XSSFColor
来更改文本颜色可能有点棘手(这里和这里有一些有用的提示),下面是一个例子:
XSSFRichTextString richValue = new XSSFRichTextString();
XSSFFont coloredFont = workbook.createFont();
coloredFont.setColor(IndexedColors.BLUE1.index);
richValue.append("Colored text", coloredFont);
workbook.getSheetAt(0).createRow(0).createCell(0, CellType.STRING).setCellValue(richValue);
如果您想更改颜色背景,您只能更改整个XSSFCellStyle
的颜色背景。为了做到这一点,请使用自定义的XSSFCellStyle
,如下所示。这里是一个示例:
XSSFCell cell = workbook.getSheetAt(0).createRow(0).createCell(0, CellType.STRING);
XSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.DARK_RED.index);
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(cellStyle);
cell.setCellValue("Some text");
要添加超链接,唯一的方法是创建一个只包含该超链接的XSSFCell
。必须使用XSSFHyperlink
Java对象和XSSFCell#setHyperlink(Hyperlink-Hyperlink)方法。下面是一个例子:
XSSFHyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("https://www.youtube.com/watch?v=mI_y8h22c_o");
XSSFCell cell = workbook.getSheetAt(0).createRow(0).createCell(0, CellType.STRING);
cell.setHyperlink(hyperlink);
cell.setCellValue("Click here to open cute video");
如果您想要突出显示的超链接:
XSSFHyperlink hyperlink = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
hyperlink.setAddress("https://www.youtube.com/watch?v=mI_y8h22c_o");
XSSFCellStyle hlinkStyle = workbook.createCellStyle();
XSSFFont hlinkFont = workbook.createFont();
hlinkFont.setUnderline(Font.U_SINGLE);
hlinkFont.setColor(IndexedColors.BLUE.getIndex());
hlinkStyle.setFont(hlinkFont);
XSSFCell cell = workbook.getSheetAt(0).createRow(0).createCell(0, CellType.STRING);
cell.setHyperlink(hyperlink);
cell.setCellValue("Click here to open cute video");
cell.setCellStyle(hlinkStyle);
如果要将一些XSSFCell
合并为一个,请使用方法XSSFSheet#addMergedRegion(CellRangeAddress区域),如下所示
sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
其中CellRangeAddress
构造函数需要int firstRow、int lastRow、int firstCol、int lastCol
。
如果您想从您的XSSFSheet
中删除所有网格线,请使用XSSFSheet#setDisplayGridline(布尔显示)。如果您想从特定的XSSFcell
中删除网格线,您必须使用这样的技巧(再次利用XSSFCellStyle
)(这是使用Apache Poi的唯一可能方法):
XSSFCellStyle noUpGridlines = workbook.createCellStyle();
noUpGridlines.setBorderTop(BorderStyle.THIN);
noUpGridlines.setTopBorderColor(IndexedColors.WHITE.index);
XSSFCell cell = workbook.getSheetAt(0).createRow(60).createCell(1, CellType.STRING);
cell.setCellStyle(noUpGridlines);
cell.setCellValue("Oh no, where is my top gridline?");
我正在运行几个脚本,但我总是得到同样的错误。它们都是相同条件的多表连接。 数据以拼花形式存储。 我们有许多带有相同条件的多表联接语句的SQL查询,但只有少数SQL脚本遇到这些错误。
我想要,我的光标移动到下一个具有不同内容的单元格,我想要光标跳过所有已经存在值的单元格。 例如,我们有列:啤酒,汽车,汽车,房子,啤酒,树(KEY_AREA) 光标应选择:Beer、Car、House、Tree和skip 1 Car和1 Beer。
问题内容: 我想在bokeh中显示一个DataTable,根据单元格的文本内容,单元格是红色还是橙色。 例如,如果单元格包含单词“错误”,则该单元格将以红色背景显示。如果单元格包含“警告”一词,则为橙色。 我相信我应该使用,但是怎么用呢? 我该怎么做? 谢谢 问题答案: 浏览文档,您可以使用HTMLTemplateFormatter和下划线js格式化表格。有关更多信息,请参见http://docs
我想代表其他列条件以不同的顺序排列我的列。 有一张桌子看起来像这样: 如果状态为1,则按日期ASC排序,状态为0按日期DESC排序 寻找以下结果 有没有办法点这个。哪儿也找不到 谢谢
有什么想法吗? 多谢了。
这应该返回3,因为如果我将从单元格(2,1)开始,我将通过上下左右移动得到39,39,39,我的方法看起来像find_cells(int[][]矩阵,int行,int col),其中row和col是起点。不要使用任何帮助器方法。我得到1可能是因为我将邻居标记为true,下次当我试图访问它们时,它会跳过它们。很抱歉缩进了。