当前位置: 首页 > 知识库问答 >
问题:

Apache POI单元,具有多条不同风格的线条

何长恨
2023-03-14

此外,有些单元格有多行,每行都可能有不同的样式(超链接、背景色、纯文本),这在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]++;
        });
}

谢啦

共有1个答案

齐迪
2023-03-14
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();

输出:

  1. 单元格内的格式化文本
  2. 单元格内的彩色文本
  3. 彩色单元格的背景
  4. 超链接
  5. 将一组单元格合并为单个单元格
  6. 移除单元格网格线(一个小技巧)

当使用. xlsx excel文件时(这意味着使用XSSFApache Poi对象,看看这篇文章中XSSFHSSFApache Poi对象之间的区别),您可以使用XSSFRichTextString来填充XSSFcell中的一些格式化文本。使用XSSFRichTextString,您可以添加与自定义XSSFFont相关联的新文本,并使用\n字符来开始新行(如果您已经在XSSFCellStyleXSSFCellStyle上调用了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。必须使用XSSFHyperlinkJava对象和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,下次当我试图访问它们时,它会跳过它们。很抱歉缩进了。