SaveFormat.HTML 转为为html问题

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
你愿意提供你的样例文件和代码吗?我们很快就会检查。

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); 

希望能够帮助到你。

将公式设置为单元格的值转换为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,"&gt;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,"&gt;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 源代码有什么不同? 我们会尽快检查。

aspose-cells-21.2版本是正确的

@baicai
单元格合并是我们内部的一种处理逻辑。当excel文件很大时,特别是有很多空的单元格,如果每个单元格都输出,html将会是一个巨大的文件。通过一些规则将单元格合并,在获得好的数据呈现的同时还可以有效减小html文件大小。

@baicai
在设置值后,如果你将文件保存到xlsx。通过excel打开后,你会发现A2单元格的值也出现了跨列,延伸到了B2单元格。请查看附件 (7.5 KB)。
当你用Excel导出到html时,虽然A2的单元格没有合并,但是它将数据做了部分隐藏。如果你需要这个结果,你可以使用以下语句:

options.setHtmlCrossStringType(HtmlCrossType.FIT_TO_CELL);

这样导出的html将会和excel导出html一样。

谢谢。
设置为HtmlCrossType.FIT_TO_CELL 后解决了合并单元格的问题,
但是又出现了我问的第一个问题,单元格中的内容显示不全,被隐藏了一部分。

@baicai ,

我认为您应该使用 HtmlCrossType.CROSS 选项,并且不必担心合并单元格,因为我们这样做是为了最大限度地减少生成的 HTML 和性能基础。 它不会产生太大影响,并且可以为您提供更好的数据呈现。

感谢您的建议,但是某些场景更注重的是表达的准确性而不是性能。

@baicai
通过样例文件和代码进行测试。默认情况下21.2的版本A2单元格在导出到html时没有向后进行合并。最新版本在平衡性能和准确性上还有一些瑕疵。无论如何,我们将建立单子进行研究,希望能平衡性能和表达的准确性。

我们已经在内部问题跟踪系统中打开了以下新问题单,并将根据Free Support Policies中提到的条款提供修复。
问题单号:CELLSJAVA-45670

@baicai

在您的问题得到修复之前,您可以通过以下代码实现需求:

workbook.getWorksheets().get(0).autoFitColumns();
options.setHtmlCrossStringType(HtmlCrossType.DEFAULT);

希望能够帮助到你。

感谢您建议。
根据您的建议,测试后还是有问题,但是您的建议给我了启发,发现使用

        workbook.getWorksheets().get(0).autoFitColumns();
        options.setHtmlCrossStringType(HtmlCrossType.FIT_TO_CELL);

可以临时解决问题,但是单元格宽度不漂亮。

@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.

@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)