Poi 创建带有超链接单元格的 excel?

使用poi导出excel 将同一个单元格内的多个网址变成对应的超链接

阅读 3k
2 个回答

更新

先来在 excel 中看一个单元格能不能添加多个超链接: multiple-hyperlinks-in-one-cell

答案很明显是不能,这不是 poi 的问题,excel 本身就没有这种规则。

但是从这里可以了解到有迂回的方法。

  1. Click Insert in the ribbon, and then click Shape, then you can select a rectangle shape
  2. Drawing a rectangle in the text that you want to insert hyperlink. And the rectangle will shade the text. See screenshot
  3. hen click the rectangle and right-click, and choose the Format Shape from the menu, and then a Format Shape dialog box will pop out. Click Fill in the left pane, and check No fill in the right pane. See screenshot
  4. Go on clicking Line Color in the left pane, and check No line in the right pane
  5. Then click Close button. And the rectangle has been changed transparently. See screenshot
  6. Put the cursor at the transparent rectangle, and right-click, choose Hyperlink from the menu, and then you can specify the file or enter the address to be hyperlinked

翻译过来的大致意思就是:增加一个透明的矩形放置于单元格之上,并设置超链接。

那么怎么用 poi 做到这一点呢?

这里给了方法。

但是这个我看到这个方法并没有设置矩形为透明的代码,也就是说这一部分需要你自己去研究了。

如果你能够想到这个方案接下来面临的问题,并且还有兴趣的话,可以告诉我继续帮你找到方法,否则就放弃吧。

接下来还有几个问题:

  1. 你需要调整单元格的大小
  2. 需要将矩形放置到合适的位置
  3. 位置计算将会非常困难,因为涉及到字体大小,文字的动态改变,难,但不是不可以。

最后我认为还有更简单的方式,直接放网址进去,都能够识别网址,直接点击,但是不能有别名。
image.png


原答案

org.apache.poi.ss.usermodel.Cell 方法 setHyperlink

fun main() {
    val url = "https://segmentfault.com/q/1010000043471701"

    XSSFWorkbook().use { workbook ->
        FileOutputStream("test.xlsx").use { fileout ->
            val sheet: Sheet = workbook.createSheet()
            val link: Hyperlink = workbook.creationHelper.createHyperlink(HyperlinkType.URL)
            link.address = url
            val row: Row = sheet.createRow(0)
            val cell: Cell = row.createCell(0)
            val cellText = "springboot导出excel?"
            cell.setCellValue(cellText)
            cell.hyperlink = link
            sheet.setColumnWidth(0, cellText.length * 256)
            workbook.write(fileout)
        }
    }
}

来源。

// 创建一个Excel文档
Workbook workbook = new XSSFWorkbook();

// 创建一个工作表
Sheet sheet = workbook.createSheet("Sheet1");

// 创建一个行对象
Row row = sheet.createRow(0);

// 创建一个单元格对象
Cell cell = row.createCell(0);

// 在单元格中添加多个网址
String urls = "https://www.google.com,https://www.baidu.com,https://www.yahoo.com";

// 将网址分割成一个字符串数组
String[] urlArray = urls.split(",");

// 遍历网址数组,并将每个网址转换成超链接
for (String url : urlArray) {
    // 创建一个超链接对象
    CreationHelper createHelper = workbook.getCreationHelper();
    Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.URL);

    // 设置超链接的地址
    hyperlink.setAddress(url);

    // 在单元格中添加超链接
    cell.setHyperlink(hyperlink);

    // 将网址添加到单元格中
    cell.setCellValue(url);

    // 创建一个新的单元格对象,以便在下一个循环中添加超链接
    cell = row.createCell(cell.getColumnIndex() + 1);
}

// 将Excel文档写入输出流中
workbook.write(outputStream);
workbook.close();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏