jimureport使用过程中“踩坑”记录

一、积木存在无法识别特殊字符

如果存在特殊字符的情况可以使用下面的代码替换掉所有的特殊字符

private String removeJimu(String name) {

return name.replaceAll("[^a-zA-Z0-9]", "");

}

二、积木中的pdf生成模块现在并不支持

一般这个时候会直接使用excel2pdf工具,代码如下:

String coaPdfUrl =

fileService.upload(PdfUtil.*excel2pdf*(url, url.getPath().substring(url.getPath().lastIndexOf('/') + 1) + ".pdf"));

注意excel2pdf中存在是否支持分页的情况,一般都需要支持

// 参数true把内容放在一张PDF页面上

pdfSaveOptions.setOnePagePerSheet(false);

三、积木中报错功能会导致查不到值

积木数据采集接口如果报错则不会返回值,所以一般是不需要值的。

四、循环体删除后也需要删除不需要的空白字段

这个会导致excel会持续输出

五、积木的excel接口

public String coaNewExport(String token, ReportProductConfig reportProductConfig) {

// 查询模板id

String reportConfigId = reportProductConfig.getReportConfigId();

if (CommonUtil.isEmpty(reportConfigId)) {

throw new ApiException("模板id不能为空");

}

ReportConfig reportConfig = reportConfigService.getById(reportConfigId);

String jimuReportId = reportConfig.getJimuReportId();

// 上传值

JSONObject var7 = new JSONObject();

var7.put("productBatchNum", reportProductConfig.getProductBatchNum());

var7.put("customerProductCode", reportProductConfig.getCustomerProductCode());

var7.put("cylinderNum", reportProductConfig.getCylinderNum());

var7.put("productId", reportProductConfig.getProductId());

// 调用积木报表

Map var11 = this.exportExcel.exportExcel(jimuReportId, var7, null, (Boolean) null);

// 生成excel表

SXSSFWorkbook var14 = (SXSSFWorkbook) var11.get("workbook");

ByteArrayOutputStream var15 = new ByteArrayOutputStream();

File toFile = new File(reportProductConfig.getProductName() + ".xlsx");

try {

var14.write(var15);

String var17 = Base64Utils.encodeToString(var15.toByteArray());

//转换成byte

byte[] buffer = Base64Utils.decodeFromString(var17);

toFile = bytesToFile(buffer, toFile);

FileInputStream fileInputStream = new FileInputStream(toFile);

String uploadFile = fileService.upload(new MockMultipartFile("copycoaMerge", "coa.xlsx", ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream));

toFile.delete();

return uploadFile;

} catch (Exception e) {

//未生成文件事务回滚

}

return null;

}

六、if函数的使用

if函数的使用的时候,如果要返回原值,则只需要返回let 定义的变量名称就可以了

=(let Al= intval(${api2.Al}); if(Al<=10){round(1.123456,2)}else{Al})

且函数拥有优先级别,if函数必须放在最外层,否则会报错。

七 jimureport中还有租户的判断可以在配置类中进行修改jeecg :

jmreport:

#多租户模式,默认值为空(created:按照创建人隔离、tenant:按照租户隔离) (v1.6.2+ 新增)

saasMode: tenant

# 打印纸张配置 title描述 size宽高

printPaper:

- title: A5纸

size:

- 148

- 210

- title: B4纸

size:

- 250

- 353

uploadType: minio

minio:

minio_url: http://188.28.6.31:9000

minio_name: wanwuzhihui123456

minio_pass: wwzh123456

bucketName: zhongjuxin

八 left join 出现重复on导致sql语句报错

mybatis-plus开启多租户插件功能时,在进行链表查询时会重复出现on导致sql语句报错

原因:

原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器

分页拆件中的jsqlparser解析器,在处理left join on表达式是这样的

public void setOnExpression(Expression expression){

onExpression.add(0,expression);

}

mybatis-plus的jsqlparser解析器,在处理left join on表达式是这样的

public void setOnExpression(Expression expression){

onExpression = expression

}

解决办法:

排除pagehelper-spring-boot-starter的jar中的jsqlparser依赖

排除

org.jeecgframework.jimureport

jimureport-spring-boot-starter

1.6.6

jsqlparser

com.github.jsqlparser

九. 汉字全部变成了“?”

解决方法:在字符串前添加N

这个问题时由于sql server的select语句的特殊性导致的

在 SQL Server 中,在汉字字符串前添加 N 是为了指定该字符串为 Unicode 字符串。以下是具体原因和相关解释:

Unicode 支持:

N 前缀表示该字符串是 Unicode 字符串。Unicode 是一种国际字符编码标准,支持全球几乎所有的语言和字符集,包括中文、日文、韩文等。

如果不加 N 前缀,SQL Server 会将字符串视为非 Unicode 字符串(即使用数据库默认的字符集和排序规则),这可能导致字符乱码或数据丢失。数据类型:

Unicode 字符串 使用 NVARCHAR、NCHAR 和 NTXT 数据类型。

非 Unicode 字符串 使用 VARCHAR、CHAR 和 TEXT 数据类型。性能考虑:

使用 Unicode 字符串会占用更多的存储空间,因为每个字符占用 2 个字节(而非 Unicode 字符串每个字符占用 1 个字节)。

在处理大量文本数据时,需要权衡存储空间和字符集支持的需求。避免乱码:

​ 在处理多语言或包含特殊字符的数据时,使用 Unicode 字符串可以有效避免乱码问题,确保数据的完整 性和正确性。

总结来说,为了确保在 SQL Server 中正确处理和存储包含汉字的字符串,建议在字符串前添加 N 前缀,以指定其为 Unicode 字符串。这样可以避免字符乱码问题,确保数据的准确性和完整性。

-- 非 Unicode 字符串

SELECT '你好,世界';

-- Unicode 字符串

SELECT N'你好,世界';

十,Wrong number of args(1) passed to round

这个错误是因为round函数报错,查看是否正确,以及是否有为零的