现在碰到一个问题,我java生成好的execl文件,用svgSaveOptions把excel转为svg的时候用了excel.getWorksheets().get(i).autoFitRows(true);生成没有问题。
但是如果我是java代码读取excel文件后做一些赋值操作,然后生成流文件,再用excel.getWorksheets().get(i).autoFitRows(true);的时候,图片位置出力不正确,是什么原因?
@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);
好的,确实可以用了,谢谢。
最近客户问了我们一个问题,就是关于excel转svg的时候,明明是一段文字为什么会分多个text标签显示,能不能一段文字在同一个标签中显示
@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")
@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”。当然,文本分割确实是我们未来的优化方向,我们会在未来的开发任务中单独列出这个问题。但这个任务无法在短时间内完成,未来如果有进展我们会立即通知您。