我用java设置了单元格下拉,直接返回前端,下拉会丢失,我要重新加载一次gridjs生成的缓存文件才能生效
2327574bf1bc700e6406a7ee9cb9c76a.png (37.4 KB)
设置下拉
不生效代码
ebfac12110c4882d47540370bd6bf7f6.png (38.9 KB)
生效代码
a662c7717d07d1036263cf04ca780b80.png (23.9 KB)
另外还有个问题,我现在excel有些数据量很大,还有并发请求,我怎么防止oom。比如我设计排队,从aspose端控制,有什么优化或者设置的建议吗
@feng.qun.zhu.avaryholding.com
你直接提供一个sample工程给我们吧。
文件很大的话,你可以使用流式输输入输出,用我们的stream api 来获取json,就不会Oom。
我的是往excel铺数据,造成OOM,我会限制请求和数据量
aspose端的优化,我问了AI,是这三点就可以吗
LoadOptions.setMemorySetting(MemorySetting.MemoryPreference):让 Aspose 用临时文件缓存单元格数据,牺牲速度换堆占用,大数据量场景必开;
- 写入大文件用 LightCells API(
LightCellsDataProvider):以流式回调方式逐行/逐区写单元格,Workbook 不在堆里持有全部数据——这是 Aspose 官方给“几十万行导出”场景的标准答案;
- 控制样式开销:样式对象、合并单元格在 Aspose 里非常吃内存,逐单元格
setStyle 会产生大量重复对象,用 Style 复用 + 批量套用。
工程无法提供,我把关键代码贴出来
导出json,下拉消失
public static String getExcelString(String fileName, Workbook workbook) {
GridJsWorkbook wbj = new GridJsWorkbook();
try {
StringBuilder sb = wbj.getJsonByUid(fileName, fileName);
if (sb == null) {
workbook.calculateFormula();
wbj.importExcelFile(fileName, workbook);
sb = wbj.exportToJsonStringBuilder(fileName);
}
return sb.toString();
} catch (Exception e) {
return "获取文件失败" + e.getMessage();
}
}
设置下拉代码
//设置单元格为下拉
List isCriticalEqpTypeList = List.of(“Y”, “N”);
String isCriticalEqpTypeFormula = String.join(“,”, isCriticalEqpTypeList);
CellArea isCriticalEqpTypeArea = new CellArea();
isCriticalEqpTypeArea.StartRow = 1;
isCriticalEqpTypeArea.EndRow = dataList.size() + 1;
isCriticalEqpTypeArea.StartColumn = DATA_START_COL + 8;
isCriticalEqpTypeArea.EndColumn = DATA_START_COL + 8;
int isCriticalEqpTypeValidationIndex = worksheet.getValidations().add(isCriticalEqpTypeArea);
Validation isCriticalEqpTypevalidation = worksheet.getValidations().get(isCriticalEqpTypeValidationIndex);
isCriticalEqpTypevalidation.setType(ValidationType.LIST);
isCriticalEqpTypevalidation.setFormula1(isCriticalEqpTypeFormula);
isCriticalEqpTypevalidation.setInCellDropDown(true);
isCriticalEqpTypevalidation.setShowError(true);
isCriticalEqpTypevalidation.setInputMessage("请从下拉列表中选择一个选项");
List<ScmUiWorkstationMachineProcessTypeDto> processTypeDict = loadProcessTypeDict();
Set<String> processTypeNameSet = processTypeNameSet(processTypeDict);
String processTypeFormula = String.join(",", processTypeNameSet);
CellArea processTypeArea = new CellArea();
processTypeArea.StartRow = 1;
processTypeArea.EndRow = dataList.size() + 1;
processTypeArea.StartColumn = DATA_START_COL + 12;
processTypeArea.EndColumn = DATA_START_COL + 12;
int processTypeValidationIndex = worksheet.getValidations().add(processTypeArea);
Validation processTypeValidation = worksheet.getValidations().get(processTypeValidationIndex);
processTypeValidation.setType(ValidationType.LIST);
processTypeValidation.setFormula1(processTypeFormula);
processTypeValidation.setInCellDropDown(true);
processTypeValidation.setShowError(true);
processTypeValidation.setInputMessage("请从下拉列表中选择一个选项");
@feng.qun.zhu.avaryholding.com
感谢您提供的关键代码片段。
我们已将您补充的下拉数据验证设置以及 GridJsWorkbook 导出 JSON 的相关代码更新到内部跟踪问题中,并已转交给开发团队做进一步分析与排查。
一旦开发团队有针对该问题的调查进展或解决结果,我们会第一时间在此贴中通知您。
@feng.qun.zhu.avaryholding.com
你这代码我们这边无法跑起来。
你可以这样测试下拉效果 new workbook,然后设置完保存成一个Excel文件,然后用Excel打开看一下有没有效果。
@feng.qun.zhu.avaryholding.com
使用stream api
gridjsworkbook.jsonToStreamByUid(OutputStream stream, String uid, String filename)
不要用stringbuilder,如果json太大的话会OoM。
你可以java设置A1单元格下拉,然后用gridjs返回前端,是没有的
如果重新加载一下生成的缓存文件,就可以(下图,多了一部读excel缓存,再加载一次)
a662c7717d07d1036263cf04ca780b80.png (23.9 KB)
@feng.qun.zhu.avaryholding.com
这很简单你直接写个main函数打印一下json就行了
我可以写个测试案例给你