baicai
October 19, 2023, 7:07am
1
workbook.save(baos, SaveFormat.HTML);
如上将excel转换为html,在老版本中转换如下:
<td height='16' class='x17' style='height:12.3pt;overflow:hidden;'>B202310191143390700</td>
而新版本中,转换如下:
<td height='16' class='x22' style='height:12.3pt;overflow:hidden;'>B20231019<span style='display:none'>1143390700</span></td>
新版本的转换多了一个<span style='display:none'>
标签,有什么解决办法可以删除这个标签,得到老版本的结果吗
@baicai
你愿意提供你的样例文件和代码吗?我们很快就会检查。
baicai
October 19, 2023, 7:37am
3
package test;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args) throws Exception {
String path = "C:\\test\\test.xlsx";
FileInputStream fis = new FileInputStream(path);
Workbook wb = new Workbook(fis);
//copy
Workbook workbook = new Workbook();
workbook.getWorksheets().get(0).copy(wb.getWorksheets().get(0));
//转换为HTML
ByteArrayOutputStream baos = new ByteArrayOutputStream();
workbook.save(baos, SaveFormat.HTML);
// 老版本输出:<td height='16' class='x17' style='height:12.3pt;overflow:hidden;'>B202310191143390700</td>
System.out.println(baos.toString());
// 新版本输出:<td height='16' class='x22' style='height:12.3pt;overflow:hidden;'>B20231019<span style='display:none'>1143390700</span></td>
fis.close();
wb.dispose();
workbook.dispose();
}
}
test.zip (6.1 KB)
@baicai
使用Excel打开你的样例文件,可以发现在Excel里A2单元格的内容只显示了部分。所以在导出时默认情况下也会有部分内容被隐藏。如果你想内容不被隐藏,你可以设置导出HTML时字符串的跨越类型。样例代码如下:
Workbook workbook = new Workbook(filePath + "test.xlsx");
HtmlSaveOptions options = new HtmlSaveOptions();
options.setHtmlCrossStringType(HtmlCrossType.CROSS);
workbook.save(filePath + "out_java.html", options);
希望能够帮助到你。
baicai
October 19, 2023, 9:58am
5
将公式设置为单元格的值转换为HTML后,单元格被合并,什么原因呢
我想要的效果如下:
image.png (1.2 KB)
而实际得到的效果如下:
image.png (1.2 KB)
test2.zip (6.5 KB)
package test;
import com.aspose.cells.*;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
public class Test {
public static void main(String[] args) throws Exception {
String path = "C:\\test\\test2.xlsx";
FileInputStream fis = new FileInputStream(path);
Workbook wb = new Workbook(fis);
Cells cells = wb.getWorksheets().get(0).getCells();
int maxRow = cells.getMaxRow();
int maxColumn = cells.getMaxColumn();
// 遍历单元格,将公式作为值放入单元格中
for (int m = 0; m <= maxRow; m++) {// 行
for (int n = 0; n <= maxColumn; n++) {// 列
Cell cell = cells.get(m, n);
String formula = cell.getFormula();
if (formula != null) {
// 注释这里代码就会得到我想要的效果
cell.setValue(formula);
}
}
}
//copy
Workbook workbook = new Workbook();
workbook.getWorksheets().get(0).copy(wb.getWorksheets().get(0));
//转换为HTML
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HtmlSaveOptions options = new HtmlSaveOptions();
options.setHtmlCrossStringType(HtmlCrossType.CROSS);
workbook.save(baos, options);
/* 我想要的效果如下:
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>=COUNTIFS(B:B,">60")</td>
<td></td>
<td></td>
</tr>
</table>
*/
System.out.println(baos.toString());
/* 实际得到的效果如下:
<table>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td colspan='2'>=COUNTIFS(B:B,">60")</td>
<td></td>
</tr>
</table>
*/
fis.close();
wb.dispose();
workbook.dispose();
}
}
@baicai ,
我尝试通过 MS Excel 手动将 Excel 文件(包含所需的公式)保存到 HTML(网页),并且我还获得了公式的“ ”标签。 一般来说,Aspose.Cells 遵循 MS Excel 标准来解析和渲染 HTML。 与 MS Excel 渲染的 HTML 相比,您是否发现 Aspose.Cells 的 HTML 源代码有什么不同? 我们会尽快检查。
@baicai
单元格合并是我们内部的一种处理逻辑。当excel文件很大时,特别是有很多空的单元格,如果每个单元格都输出,html将会是一个巨大的文件。通过一些规则将单元格合并,在获得好的数据呈现的同时还可以有效减小html文件大小。
@baicai
在设置值后,如果你将文件保存到xlsx。通过excel打开后,你会发现A2单元格的值也出现了跨列,延伸到了B2单元格。请查看附件 (7.5 KB)。
当你用Excel导出到html时,虽然A2的单元格没有合并,但是它将数据做了部分隐藏。如果你需要这个结果,你可以使用以下语句:
options.setHtmlCrossStringType(HtmlCrossType.FIT_TO_CELL);
这样导出的html将会和excel导出html一样。
baicai
October 19, 2023, 4:53pm
10
谢谢。
设置为HtmlCrossType.FIT_TO_CELL 后解决了合并单元格的问题,
但是又出现了我问的第一个问题,单元格中的内容显示不全,被隐藏了一部分。
@baicai ,
我认为您应该使用 HtmlCrossType.CROSS 选项,并且不必担心合并单元格,因为我们这样做是为了最大限度地减少生成的 HTML 和性能基础。 它不会产生太大影响,并且可以为您提供更好的数据呈现。
baicai
October 20, 2023, 1:11am
12
感谢您的建议,但是某些场景更注重的是表达的准确性而不是性能。
John.He
October 20, 2023, 1:54am
13
@baicai
通过样例文件和代码进行测试。默认情况下21.2的版本A2单元格在导出到html时没有向后进行合并。最新版本在平衡性能和准确性上还有一些瑕疵。无论如何,我们将建立单子进行研究,希望能平衡性能和表达的准确性。
我们已经在内部问题跟踪系统中打开了以下新问题单,并将根据Free Support Policies 中提到的条款提供修复。
问题单号:CELLSJAVA-45670
@baicai
在您的问题得到修复之前,您可以通过以下代码实现需求:
workbook.getWorksheets().get(0).autoFitColumns();
options.setHtmlCrossStringType(HtmlCrossType.DEFAULT);
希望能够帮助到你。
baicai
October 20, 2023, 3:48am
15
感谢您建议。
根据您的建议,测试后还是有问题 ,但是您的建议给我了启发,发现使用
workbook.getWorksheets().get(0).autoFitColumns();
options.setHtmlCrossStringType(HtmlCrossType.FIT_TO_CELL);
可以临时解决问题,但是单元格宽度不漂亮。
John.He
October 20, 2023, 5:44am
16
@baicai
感谢你的反馈。一旦修复好问题,我们将即时通知你。
1 Like
@baicai
您的问题(CELLSJAVA-45670)已得到解决。 该修复将包含在我们计划于 2023 年 11 月上半月发布的即将发布的版本 (Aspose.Cells v23.11) 中。在下一版本发布时,请使用以下语句:
options.setHtmlCrossStringType(HtmlCrossType.MS_EXPORT);
这样导出的html单元格不会合并。
附件是修复后生成的结果以供参考:CELLSJAVA-45670.zip (1.7 KB)
@baicai
您的问题(CELLSJAVA-45671)已得到解决。 该修复将包含在我们计划于 2023 年 11 月上半月发布的即将发布的版本 (Aspose.Cells v23.11) 中。在下一版本发布时,您将收到通知。
附件是修复后生成的结果以供参考:CELLSJAVA-45671.zip (1.6 KB)
The issues you have found earlier (filed as CELLSJAVA-45670,CELLSJAVA-45671) have been fixed in Aspose.Cells for Java 23.11 .
baicai
December 21, 2023, 7:08am
22
@amjad.sahi @Eric.wang @aspose.notifier
你好,我这边测试发现还是有单元格内容未显示全。
public static void main(String[] args) throws Exception {
String path = "C:\\test.xlsx";
FileInputStream fis = new FileInputStream(path);
Workbook wb = new Workbook(fis);
int count = wb.getWorksheets().getCount();
Pattern compile = Pattern.compile("<table.+?</table>", Pattern.DOTALL);
for (int i = 0; i < count; i++) {
Worksheet worksheet = wb.getWorksheets().get(i);
Cells cells = worksheet.getCells();
int maxColumn = cells.getMaxColumn();
int maxRow = cells.getMaxRow();
for (int m = 0; m <= maxRow; m++) {
for (int n = 0; n <= maxColumn; n++) {
Cell cell = cells.get(m, n);
String formula = cell.getFormula();
if (formula != null) {
cell.setValue(formula);
}
}
}
// copy
Workbook workbook = new Workbook();
workbook.getWorksheets().get(0).copy(worksheet);
// Convert to HTML
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HtmlSaveOptions options = new HtmlSaveOptions();
// options.setHtmlCrossStringType(HtmlCrossType.CROSS);
options.setHtmlCrossStringType(HtmlCrossType.MS_EXPORT);
workbook.save(baos, options);
workbook.dispose();
Matcher matcher = compile.matcher(baos.toString());
if (matcher.find()) {
System.out.println(matcher.group());
}
}
fis.close();
wb.dispose();
}
输出的效果:
image.png (1.8 KB)
想要的效果:
image.png (1.9 KB)
样式宽度不需要关注,但是需要单元格值的完整性,和单元格的个数一致。
test3.zip (6.6 KB)