Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ApachePOI创建链接到长url的excel超链接_Java_Excel_Apache Poi_Apache Poi 4 - Fatal编程技术网

Java 如何使用ApachePOI创建链接到长url的excel超链接

Java 如何使用ApachePOI创建链接到长url的excel超链接,java,excel,apache-poi,apache-poi-4,Java,Excel,Apache Poi,Apache Poi 4,Excel正在进行一次测试 现在,我使用ApachePOI以编程方式填充excel,但使用的是一个s3预签名url,其长度远远超过255个字符,1350多个字符 当我单击excel中创建的超链接时,它会显示如下警告:“发生了意外错误。” 这是我对应的代码: import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.poi.common.usermode

Excel正在进行一次测试

现在,我使用ApachePOI以编程方式填充excel,但使用的是一个s3预签名url,其长度远远超过255个字符,1350多个字符

当我单击excel中创建的超链接时,它会显示如下警告:“发生了意外错误。”

这是我对应的代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.common.usermodel.HyperlinkType;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFHyperlink;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

  public void generateExcel(List<FunctionalTestCaseResult> data) {

      XSSFWorkbook workbook = new XSSFWorkbook();
      CreationHelper createHelper = workbook.getCreationHelper();
      XSSFSheet sheet = workbook.createSheet("Sheet1");

      int rowNum = 0;
      Row row = sheet.createRow(rowNum++);
      int cellNum = 0;
      CellStyle captionStyle = workbook.createCellStyle();
      captionStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
      captionStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

      //create hyper link style
      XSSFCellStyle hlinkstyle = workbook.createCellStyle();
      XSSFFont hlinkfont = workbook.createFont();
      hlinkfont.setUnderline(XSSFFont.U_SINGLE);
      hlinkfont.setColor(IndexedColors.BLUE.index);
      hlinkstyle.setFont(hlinkfont);

      Cell cell = row.createCell(cellNum++);

      XSSFHyperlink link = (XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.URL);
      link.setAddress(recordingS3Url);
      cell.setHyperlink(link);
      cell.setCellValue("Recording url");
      cell.setCellStyle(hlinkstyle);

  }
import org.apache.logging.log4j.LogManager;
导入org.apache.logging.log4j.Logger;
导入org.apache.poi.common.usermodel.HyperlinkType;
导入org.apache.poi.ss.usermodel.Cell;
导入org.apache.poi.ss.usermodel.CellStyle;
导入org.apache.poi.ss.usermodel.CreationHelper;
导入org.apache.poi.ss.usermodel.FillPatternType;
导入org.apache.poi.ss.usermodel.IndexedColors;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.xssf.usermodel.XSSFCellStyle;
导入org.apache.poi.xssf.usermodel.xssfont;
导入org.apache.poi.xssf.usermodel.XSSFHyperlink;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
public void generateExcel(列表数据){
XSSFWorkbook工作簿=新XSSFWorkbook();
CreationHelper createHelper=workbook.getCreationHelper();
XSSFSheet sheet=workbook.createSheet(“Sheet1”);
int rowNum=0;
Row-Row=sheet.createRow(rowNum++);
int-cellNum=0;
CellStyle captionStyle=工作簿.createCellStyle();
captionStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
captionStyle.setFillPattern(FillPatternType.SOLID\u前景);
//创建超链接样式
XSSFCellStyle hlinkstyle=workbook.createCellStyle();
XSSFFont hlinkfont=workbook.createFont();
hlinkfont.setUnderline(XSSFFont.U_SINGLE);
hlinkfont.setColor(IndexedColors.BLUE.index);
hlinkstyle.setFont(hlinkfont);
Cell Cell=row.createCell(cellNum++);
XSSFHyperlink=(XSSFHyperlink)createHelper.createHyperlink(HyperlinkType.URL);
link.setAddress(recordingS3Url);
cell.setHyperlink(link);
cell.setCellValue(“记录url”);
cell.setCellStyle(hlinkstyle);
}

您提到的限制是关于公式中的
=HYPERLINK
函数<代码>Excel公式长度不能超过255个字符

默认单元格超链接的URL长度没有限制。下面的代码创建了一个单元格,该单元格具有指向长度为1554个字符的URL的超链接

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.common.usermodel.HyperlinkType;

class CreateExcelHyperlinkLongURL {

 public static void main(String[] args) throws Exception {

  String url = "https://www.google.de/search?&q=Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.&oq=Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.";

  int urlLength = url.length();

  System.out.println(urlLength);

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   Sheet sheet = workbook.createSheet(); 

   Hyperlink link = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
   link.setAddress(url);
 
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   String cellText = "Open link to long URL having length of " + urlLength + " characters.";
   cell.setCellValue(cellText);
   cell.setHyperlink(link);
 
   sheet.setColumnWidth(0, cellText.length() * 256);

   workbook.write(fileout);
  }

 }
}
这对我来说适用于使用ApachePOI4.1.0和Excel 2016


如果URL太长,则某些
Excel
版本无法正确打开
*.xlsx
文件。发生这种情况的确切URL长度似乎因
Excel
版本而异。

您提到的限制是关于公式中的
=HYPERLINK
函数<代码>Excel公式长度不能超过255个字符

默认单元格超链接的URL长度没有限制。下面的代码创建了一个单元格,该单元格具有指向长度为1554个字符的URL的超链接

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.common.usermodel.HyperlinkType;

class CreateExcelHyperlinkLongURL {

 public static void main(String[] args) throws Exception {

  String url = "https://www.google.de/search?&q=Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.&oq=Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.+Lorem+ipsum+dolor+sit+amet%2C+consetetur+sadipscing+elitr%2C+sed+diam+nonumy+eirmod+tempor+invidunt+ut+labore+et+dolore+magna+aliquyam+erat%2C+sed+diam+voluptua.+At+vero+eos+et+accusam+et+justo+duo+dolores+et+ea+rebum.+Stet+clita+kasd+gubergren%2C+no+sea+takimata+sanctus+est+Lorem+ipsum+dolor+sit+amet.";

  int urlLength = url.length();

  System.out.println(urlLength);

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   Sheet sheet = workbook.createSheet(); 

   Hyperlink link = workbook.getCreationHelper().createHyperlink(HyperlinkType.URL);
   link.setAddress(url);
 
   Row row = sheet.createRow(0);
   Cell cell = row.createCell(0);
   String cellText = "Open link to long URL having length of " + urlLength + " characters.";
   cell.setCellValue(cellText);
   cell.setHyperlink(link);
 
   sheet.setColumnWidth(0, cellText.length() * 256);

   workbook.write(fileout);
  }

 }
}
这对我来说适用于使用ApachePOI4.1.0和Excel 2016


如果URL太长,则某些
Excel
版本无法正确打开
*.xlsx
文件。发生这种情况的确切URL长度似乎因
Excel
版本而异。

您提到的限制是关于公式中的
=HYPERLINK
函数<代码>Excel公式长度不能超过255个字符。因此,错误的原因一定是您的
记录3URL
中的其他原因。如果不知道确切的URL,则无法提供帮助。URL是s3预签名的URL,肯定大于255个字符。只是想知道是否有任何方法可以使用ApachePOI以编程方式处理大于255个字符的url。reportS3url通常约为1400个字符。您提到的限制是关于公式中的
=HYPERLINK
函数<代码>Excel公式长度不能超过255个字符。因此,错误的原因一定是您的
记录3URL
中的其他原因。如果不知道确切的URL,则无法提供帮助。URL是s3预签名的URL,肯定大于255个字符。只是想知道是否有任何方法可以使用ApachePOI以编程方式处理大于255个字符的url。reportS3url通常大约有1400个字符。我的Excel版本是16.27。ApachePOI是4.0.1。同样的代码也不适用于我的excel版本和ApachePOI的组合。我看不到4.0.1和4.1.0在超级链接上有任何区别。我猜这和excel版本有关。还有一个问题,对于您的excel,如果您在代码中手动创建带有url的超链接,当您单击它时它是否工作?谢谢!对于我来说,答案是否定的。正如我在使用ApachePOI4.1.0和Excel 2016的回答中所说的那样,我的答案是否定的。也可以使用Excel 365。是的,我可以点击超链接,它会在系统(Windows10)的默认浏览器(Chrome)中打开。很酷,在我看来它更像是excel bug。我在mac和windows 10桌面上都试过了,都配备了Excel 2016,具体版本为16.27。你是对的,超链接255的限制是不同的,不适用于这种情况。我的Excel版本是16.27。ApachePOI是4.0.1。同样的代码也不适用于我的excel版本和ApachePOI的组合。我看不到4.0.1和4.1.0在超级链接上有任何区别。我猜这和excel版本有关。还有一个问题,对于您的excel,如果您在代码中手动创建带有url的超链接,当您单击它时它是否工作?谢谢!对于我来说,答案是否定的。正如我在使用ApachePOI4.1.0和Excel 2016的回答中所说的那样,我的答案是否定的。也可以使用Excel 365。是的,我可以点击超链接,它会在系统(Windo)中打开