废话不多说直接开始
首先Essbase连接分几种,我所知的有2种一种是使用Excel的com插件根据对应的科目加载数据至Excel 表格,另外一种呢就是使用JAVA代码连接Essbase的JAPI接口。
1.配置相关
server.username=username
server.password=password
essbase.address=localhost
essbase.provider=http://localhost:19000/aps/JAPI
首先连接Essbase需要账号密码,其次需要知道JAPI的接口地址以及需要连接的实际数据库所在的机器
ps:以上address和provider一般在正式的环境下这2个不在一台机器上。
2. 代码部分
我们连接取数的时候,类似于使用Excel的模式先构建出一个带门店带科目的表头信息。
左边呢是门店,上面呢是科目相当于2021年的工资数据,可能工资里面有细分到A,B,C,D等等,中间部分呢就是待取的数据
好我们开始
首先是公共的抽数方法
/**
* 最终的抽数方法 传入科目信息 以及appname cubename
* @param columns 科目信息
* @param s_appName appName
* @param s_cubeName cubeName
* @return
* @throws Exception
*/
public Map<String, List<Double>> getEssbaseData(List<List<String>> columns, String s_appName, String s_cubeName) throws Exception {
properties = CommonUtils.getProperties("config.properties");
s_userName = properties.getProperty("server.username");
s_password = properties.getProperty("server.password");
s_provider = properties.getProperty("essbase.provider");
s_analyticSvrName = properties.getProperty("essbase.address");
IEssbase ess = IEssbase.Home.create(IEssbase.JAPI_VERSION);
IEssDomain dom = ess.signOn(s_userName, s_password, false, null, s_provider);
IEssCubeView cv = dom.openCubeView("Data Query Example", s_analyticSvrName, s_appName, s_cubeName);
cv.setRepeatMemberNames(true);
cv.setIncludeSelection(false);
cv.setSuppressMissing(true);
cv.setSuppressZero(true);
cv.setDrillLevel(IEssOpZoomIn.EEssZoomInPreference.BOTTOM_LEVEL);
cv.updatePropertyValues();
//这里获取你的门店集合 我这里就用new一个新的
List<String> stores = new ArrayList<>();
Map<String, List<Double>> essbaseDataMap = performCubeViewOperation(ess, cv, stores, columns);
return essbaseDataMap;
}
public Map<String, List<Double>> performCubeViewOperation(IEssbase ess, IEssCubeView cv, List<String> stores, List<List<String>> columns) throws EssException {
IEssGridView grid = cv.getGridView();
setEssvaseGridView(grid, stores, columns);
IEssOperation op = null;
op = cv.createIEssOpRetrieve();
cv.performOperation(op);
int cntRows = grid.getCountRows(), cntCols = grid.getCountColumns();
Map<String, List<Double>> essbaseResultMap = new HashMap<>();
for (int r = columns.get(0).size(); r < cntRows; r++) {
String store = grid.getStringValue(r, 0).trim();
List<Double> datas = new ArrayList<>();
for (int j = 1; j < cntCols; j++) {
String value = grid.getStringValue(r, j);
if ("#Missing".equals(value)) {
value = "";
}
datas.add("".equals(value) ? 0.0 : Double.parseDouble(value));
}
essbaseResultMap.put(store, datas);
}
return essbaseResultMap;
}
public void setEssvaseGridView(IEssGridView grid, List<String> stores, List<List<String>> columns) throws EssException {
// //设置grid 表格大小 多少行 多少列
grid.setSize(columns.get(0).size() + stores.size(), 1 + columns.size());
// //设置 表头
int titleRow = 0;
for (int i = 1; i <= columns.size(); i++) {
for (int j = 0; j < columns.get(i - 1).size(); j++) {
titleRow = columns.get(i - 1).size();
//设置 表格 表头 行 列 数值
grid.setValue(j, i, columns.get(i - 1).get(j));
}
}
//设置门店列
for (int i = 0; i < stores.size(); i++) {
String storeStr = stores.get(i);
//设置 门店 行 列 门店编码 行 为 表头下第一行 列为 0
grid.setValue(titleRow + i, 0, storeStr);
}
}
然后是在其他地方构建一个科目list调用抽数方法
String[] codes= {"NumberA","NumberC","NumberD","NumberE","NumberF","NumberG"}
//构建cells
List<List<String>> columns = new ArrayList<>();
for (String item : codes) {
List<String> column = new ArrayList<>();
//年
column.add(2021);
column.add("wage");
column.add(item);
columns.add(column);
}
Map<String, List<Double>> map = getEssbaseData(columns, "appName", "cubeName");
最终返回的这个map的格式是这样子的,key呢是每个门店 value是科目的值,就跟下面的excel表格一样前面的门店是key,后面的值1000-1006是一个有序的list,从1000-1006,当然正常数据不是这样子的只是做一个演示。
以上就是本次全部内容。