Excel文件流转svg问题

现在碰到一个问题,我java生成好的execl文件,用svgSaveOptions把excel转为svg的时候用了excel.getWorksheets().get(i).autoFitRows(true);生成没有问题。
但是如果我是java代码读取excel文件后做一些赋值操作,然后生成流文件,再用excel.getWorksheets().get(i).autoFitRows(true);的时候,图片位置出力不正确,是什么原因?

@jishangyang,

您能否分享独立的 Java 代码示例和示例文件(Excel 文件和 SVG 文件)以便在我们这边重现该问题,我们会尽快检查。

PS. 请先压缩资源文件再附加到这里。

test.zip (1019.5 KB)
代码和模板都已经添加了,还有效果图,麻烦帮忙解决下,比较着急

@jishangyang
通过使用样例文件和代码在最新版本v24.6上进行测试,我们可以复现问题。发现输出文件到SVG时,在调用Worksheet.autoFitRows(true)方法后,SVG显示错误。

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

问题单号:CELLSJAVA-46037

@jishangyang
formatpic.png (7.9 KB)
你的图片设置了 不跟随 cells移动, 不跟着cell的大小一起改变,也就是绝对位置(相对于A1左上角)和大小.
所以当你修改了一下单元格,调用了excel.getWorksheets().get(i).autoFitRows(true); 后, 一些行的高度被调整了, 但是你的图片设置了不跟着Cells 移动,所以图片的位置和Cell的位置就发生了偏移。
建议你把图片设置为跟着cells 移动 和改变大小。
你可以在Excel中修改模板文件, 也可以设置 Aspose.Cells.Drawing.Shape.Placement as PlacementType.MoveAndSize

关于 Aspose.Cells.Drawing.Shape.Placement as PlacementType.MoveAndSize 我需要在 excel.getWorksheets().get(i).autoFitRows(true);
SvgSaveOptions svgSaveOptions = new SvgSaveOptions();这两个里边设置么?能给个demo么,我用的事Aspose.Cells.Java,谢谢

@jishangyang
你只需要遍历工作表里的Shape对象,然后设置Placement属性即可。请参考以下样例代码。

Workbook book = new Workbook(filePath + "test000.xlsx");
WorksheetCollection sheets = book.getWorksheets();
int sheetCount = sheets.getCount();
for (int i = 0; i < sheetCount; i++)
{
	Worksheet sheet = sheets.get(i);
    ShapeCollection shapes = sheet.getShapes();
    int shapeCount = shapes.getCount();
    for (int j = 0; j < shapeCount;j++)
    {
    	Shape shape = shapes.get(j);
    	shape.setPlacement(PlacementType.MOVE_AND_SIZE);
    	
    }
}

if(excel.getWorksheets().getCount() > excel.getWorksheets().getActiveSheetIndex()){
String uuid = UUID.randomUUID().toString();
// WorksheetCollection sheets = excel.getWorksheets();
for(int i = excel.getWorksheets().getActiveSheetIndex() ; i<excel.getWorksheets().getCount() ; i++){
excel.getWorksheets().get(i).autoFitRows(true);
WorksheetCollection sheets = excel.getWorksheets();
ShapeCollection shapes = sheets.get(i).getShapes();
int shapeCount = shapes.getCount();
for (int j = 0; j < shapeCount;j++)
{
Shape shape = shapes.get(j);
shape.setPlacement(PlacementType.MOVE_AND_SIZE);

    }
    SvgSaveOptions svgSaveOptions = new SvgSaveOptions();
    svgSaveOptions.setSheetIndex(i);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    excel.save(byteArrayOutputStream, svgSaveOptions);
    svgStr = new String(byteArrayOutputStream.toByteArray());


  }
}

我这么设置的,还是不好用,是哪里设置有问题么?

@jishangyang
请将自动调整行的代码放置到设置Placement属性之后。

样例代码如下:

//excel.getWorksheets().get(i).autoFitRows(true);
WorksheetCollection sheets = excel.getWorksheets();
ShapeCollection shapes = sheets.get(i).getShapes();
int shapeCount = shapes.getCount();
for (int j = 0; j < shapeCount;j++)
{
	Shape shape = shapes.get(j);
	shape.setPlacement(PlacementType.MOVE_AND_SIZE);

}
sheets.get(i).autoFitRows(true);
1 Like

好的,确实可以用了,谢谢。

最近客户问了我们一个问题,就是关于excel转svg的时候,明明是一段文字为什么会分多个text标签显示,能不能一段文字在同一个标签中显示

@jishangyang
你愿意提供你的样例文件和测试代码吗?我们很快就会检查。

Desktop.zip (118.1 KB)

代码 还是用之前的demo代码就可以

@jishangyang
感谢你的反馈。我们将进一步研究你的问题。一旦有更新,我们将及时通知你。

@jishangyang
经过初步测试,我能够通过使用模板文件转换为 SVG 并使用以下示例代码重现您提到的问题。我发现一些文本段落在多个文本标签中呈现。

Workbook book = new Workbook("d:\\files\\test5.xlsx");
WorksheetCollection sheets = book.getWorksheets();
int sheetCount = sheets.getCount();
for (int i = 0; i < sheetCount; i++)
  {
     Worksheet sheet = sheets.get(i);
     ShapeCollection shapes = sheet.getShapes();
     int shapeCount = shapes.getCount();
     for (int j = 0; j < shapeCount;j++)
      {
         com.aspose.cells.Shape shape = shapes.get(j);
         shape.setPlacement(PlacementType.MOVE_AND_SIZE);

      }
      sheets.get(i).autoFitRows(true);
  }
SvgSaveOptions svgSaveOptions = new SvgSaveOptions();
svgSaveOptions.setSheetIndex(0);
book.save("d:\\files\\out1.svg")

如果这是问题或预期行为,我们需要彻底评估该问题。我们已在内部问题跟踪系统中打开以下新工单,并将根据支持政策中提到的条款提供修复。
问题 ID:CELLSJAVA-46049

一旦我们更新了您的问题,我们将在此处通知您。

@jishangyang
文本拆分的问题可以通过设置ImageOrPrintOptions.IsOptimized 为true来避免。

...
SvgSaveOptions svgSaveOptions = new SvgSaveOptions();
svgSaveOptions.getImageOrPrintOptions().setOptimized(true);
svgSaveOptions.setSheetIndex(0);
book.save("d:\\files\\out1.svg")

my3.zip (9.9 KB)

使用了你们给的代码,确实有一些模板的文本不拆分了,但是我给的ZIP中的excel模板还是会出现拆分现象,麻烦帮忙调查一下原因,谢谢

@jishangyang
我们确实再现了你所说的问题,我们将仔细研究该问题,一旦有更新,我们将及时通知你。

@jishangyang
感谢你的反馈。通过使用新提供的样例文件和以下样例代码在最新版本v24.6上进行测试,我们可以复现问题。发现一行文字依然会分成多个text展示。

样例代码如下:

Workbook book = new Workbook(filePath + "test1.xlsx");
WorksheetCollection sheets = book.getWorksheets();
int sheetCount = sheets.getCount();
for (int i = 0; i < sheetCount; i++)
{
     Worksheet sheet = sheets.get(i);
     ShapeCollection shapes = sheet.getShapes();
     int shapeCount = shapes.getCount();
     for (int j = 0; j < shapeCount;j++)
      {
         com.aspose.cells.Shape shape = shapes.get(j);
         shape.setPlacement(PlacementType.MOVE_AND_SIZE);

      }
      sheets.get(i).autoFitRows(true);
}
SvgSaveOptions svgSaveOptions = new SvgSaveOptions();
svgSaveOptions.getImageOrPrintOptions().setOptimized(true);
svgSaveOptions.setSheetIndex(0);
book.save(filePath + "out_java.svg");

我们已经为此问题建立问题单“CELLSJAVA-46049”,我们将会在此单子里修复这个问题。一旦有更新,我们将及时通知你。

@jishangyang
我们的开发人员花费了大量时间调查此问题。遗憾的是,我们可能暂时无法修复此问题,因为这涉及到文本所有可能的换行和排版方式。要达到预期的效果,这可能需要重构我们的代码。从显示效果来看,文本分割似乎并不会影响实际的显示效果。所以如果避免文本分割不是您一定需要的,我们将把问题编号 CELLSJAVA-46049 设置为 “Won’t fix”。当然,文本分割确实是我们未来的优化方向,我们会在未来的开发任务中单独列出这个问题。但这个任务无法在短时间内完成,未来如果有进展我们会立即通知您。