【内部或二开】星瀚合并报表:开发指导文档(20200924new)
a) 读取报表表格数据
QFBuilder qf = new QFBuilder();
qf.add (“entity”,”=”,组织id);
qf.add (“fyear”,”=”,年id);
qf.add (“period”,”=”,期间id);
qf.add (“scene”,”=”,情景id);
qf.add (“currency”,”=”,币别id);
qf.add (“template.number”,”=”,模板编码);
qf.add (“model”,”=”,体系id);
DynamicObject report = QueryServiceHelper.queryOne(FormConstant.FORM_RPTRECORD_ENTITY, “data”,qf.toArray());
if(report != null && report.getString(“data”) != null){
SpreadManager sm = kd.fi.bcm.spread.domain.view.JsonSerializerUtil.toSpreadManager(report.getString(“data”));
Sheet sheet = sm.getBook().getSheet(0);//报表只支持单个页签,直接取第一个
sheet.getCell(r,c).getValue();//获取单元格值
sheet.getCell(r,c).getFormula();//获取单元格公式
…
kd.fi.bcm.spread.domain.view.Sheet.iteratorCells(Consumer<Cell>),sheet本身提供了很多遍历单元格的接口,还有cell有获取excel坐标的方法:kd.fi.bcm.spread.domain.Cell.getExcelAxis()
}
b) 查询多维数据可以参考参考如下方法:
1)kd.fi.bcm.business.serviceHelper.OlapServiceHelper.queryData(SQLBuilder)获取多维数据结果,这个结果集类似jdbc里面ResultSet,有个快捷方式直接转换成key-value的方式;kd.fi.bcm.business.sql.MDResultSet.asMap();
kd.fi.bcm.business.sql.MDResultSet.next() 多维数据结果集里也提供了遍历结果的方法
2)上面查询类的SQLBuilser是做了查询条件的封装,
SQLBuilder sql = new SQLBuilder(modelNum);//参数为体系编码,t_bcm_model表里的Fnumber
sql.addSelectField(selector_dim);//查询返回的维度字段,一般是当前体系的所有维度编码的数组
sql.addFilter(PresetConstant.AUDITTRIAL_DIM, auditTrailFilters);//过滤条件,这里设置了审计线索维度的过滤条件,第一参数为维度编码,第二个参数为维度成员过滤的数组,如果有更多维度过滤,则增加多条类似过滤设置该查询条件;
3)构造完成后,就可以调用OlapServiceHelper.queryData(SQLBuilder)获取多维数据结果。
Eg:
SQLBuilder sql = new SQLBuilder(“cube001”);//传入体系编码,bcm_model的number字段值
String[] dims = {“dim1”,”dim2”,”dim3”};//比如有三个维度,编码如数组里定义
sql.addSelectField(dims);
//设置dim1维度的成员过滤,dim001和dim002是维度dim1的成员。
sql. addFilter(“dim1”,new String[]{“dim001”,”dim002”});
MDResultSet rs = OlapServiceHelper.queryData(sql);
while(rs.next()) {//遍历数据
String dim2Num = rs.getString(“dim2”);//获取维度dim2列信息,比如成员值dim2001
//获取多维数据值,如果非Number类型,最好获取原始值,在通过类型判断做处理。
//BigDecimal v = rs.getBigDecimal("FMONEY");
//获取原始值
Object v = rs.getOriginalValue("FMONEY");
}
Eg://解析spreadjson获取单元格值
//spreadjson 报表里面的spreadjson属性值
String ssjson=ObjectSerialUtil.uncompress(spreadjson);
JSONObject object = JSONObject.parseObject(ssjson);
JSONObject table= ((JSONObject) object.getJSONObject("sheets").values().iterator().next()).getJSONObject("data").getJSONObject("dataTable");
JSONObject rowData = table.getJSONObject("0");//第一行
JSONObject colData = rowData.getJSONObject(“2”);//第三列数据
if (colData == null) continue;
Object val = colData.get("value");
c) 多维数据存储
假设存在测试体系(编码:cube0001)有5维度:组织(Entity),财年(Year),期间(Period),币别(Currency),过程(Process),那么要求保存数据时一定要包含所有维度,不能缺少某个维度不设置,代码示例如下:
String modelNum = “cube0001”;
OlapSaveBuilder save = new OlapSaveBuilder(modelNum);
save.setCrossDimensions(new String[]{“Entity“,“Year “,“Period “,“Currency“, “Process”});
save.setMeasures("FMONEY");
//addfixedDimension(save);
List<Pair<String[], Object>> saveValPairs = new ArrayList<>();
//多个值则for循环加
saveValPairs.add(kd.fi.bcm.common.Pair.onePair(new String[]{“org001”, “FY2020”, “M_M09”, “CNY”, “IRpt”}, 5555.123));
save.setCellSet(cvtValues);
save.doSave();
OlapSaveBuilder 这个里面有个固定维度的设置,是为了减少数据量的传输而设置的,比如说保存的都是同一组织、财年、期间的报表数据,那么就可以这样写代码:
String modelNum = “cube0001”;
OlapSaveBuilder save = new OlapSaveBuilder(modelNum);
save.setCrossDimensions(new String[]{ “Currency“, “Process”});
//固定维度设置----start----
save. addFixedDimension(“Entity“,”org001”);
save. addFixedDimension(“Year”,”FY2020”);
save. addFixedDimension(“Period”,”M_M09”);
//----------------end--------
save.setMeasures("FMONEY");
List<Pair<String[], Object>> saveValPairs = new ArrayList<>();
//多个值则for循环加
saveValPairs.add(kd.fi.bcm.common.Pair.onePair(new String[]{“CNY”,“IRpt”}, 5555.123));
save.setCellSet(cvtValues);
save.doSave();
注意:币别中EC、PC是变量成员在存储时不能作为存储成员,需指定具体币别成员,如CNY、USD等具体币别
【内部或二开】星瀚合并报表:开发指导文档(20200924new)
本文2024-09-23 00:21:20发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-138931.html