You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

365 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include"kutil.h"
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include "libxl.h"
#include <io.h>
#include <direct.h>
#include <cfm/cfm.h>
#include <wchar.h>
#include <locale>
#include <codecvt>
#include <chrono>
#include <Windows.h>
#include <thread>
#include <regex>
#include <res\reservation.h>
#include "libxl.h"
#include <map>
#include <fstream>
#include <iostream>
using namespace libxl;
using namespace std::chrono_literals;
using namespace std;
#define debug true
#define ITK_err 919012
string get_value(const map<string, string>& value_map, const string& key) {
auto iter = value_map.find(key);
if (iter != value_map.end()) {
return iter->second;
}
else {
return "";
}
}
bool isSubstring(char* str1, char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int i = 0, j = 0;
while (i < len1 && j < len2) {
if (str1[i] == ',') {
i++;
continue;
}
if (str1[i] == str2[j]) {
i++;
j++;
}
else {
i = i - j + 1;
j = 0;
}
}
if (j == len2) {
return true;
}
else {
return false;
}
}
int flag = 0;
void insertDataToExcel2(char temp_file[SS_MAXPATHLEN], map<string, string> dataList) {
printf("----------------开始执行插入数据操作---------------------\n");
//将数据写入本地使用Java插入数据
string json = "{";
for (auto it = dataList.begin(); it != dataList.end(); ++it) {
json += "\"" + it->first + "\":\"" + it->second + "\",";
}
json.pop_back(); // 删除最后一个逗号
json += "}";
printf("json:%s", json.c_str());
// 将JSON格式的字符串写入文件
ofstream ofs("D:\\ldexcel\\output.txt");
ofs << json;
ofs.close();
printf("开始执行cmd方法");
char cmd[1024] = "";
strcpy(cmd, "java -jar D:\\Siemens\\Teamcenter13\\bin\\writeAsExcel.jar");
strcat(cmd, " ");
strcat(cmd, temp_file);
strcat(cmd, " ");
strcat(cmd, "D:\\ldexcel\\output.txt");
printf("\n%s\n", cmd);
system(cmd);
printf("cmd方法执行完毕");
for (auto it = dataList.begin(); it != dataList.end(); ++it) {
cout << it->first << ": " << it->second << endl;
}
/*libxl::Book* book = xlCreateXMLBook();
printf("设置产品密匙\n");
book->setKey(L"Halil Kural", L"windows-2723210a07c4e90162b26966a8jcdboe");//设置密钥
if (book) {
printf("开始\n");
printf("path%s\n", temp_file);
int len = strlen(temp_file);
int size = MultiByteToWideChar(CP_ACP, 0, temp_file, len, NULL, 0); // 获取所需空间大小
wstring wstr(size, 0);
MultiByteToWideChar(CP_ACP, 0, temp_file, len, &wstr[0], size); // 转换为wchar_t数组
wprintf(L"path2%s", wstr.c_str()); // 使用wprintf输出
if (book->load(wstr.c_str())) {
printf("加载Excel文件成功\n");
printf("获取sheet页\n");
libxl::Sheet* sheet = book->getSheet(0);
if (sheet) {
map<string, string> dataList; // 定义一个map对象
dataList["A1"] = "Hello";
dataList["B2"] = "world!";
for (auto& data : dataList) { // 遍历map中的数据
string cellName = data.first; // 获取单元格的名称
string cellValue = data.second; // 获取单元格的值
int row = sheet->nameToRow(cellName.c_str()); // 获取行号
int col = sheet->nameToColumn(cellName.c_str()); // 获取列号
sheet->writeStr(row, col, cellValue.c_str(), 0); // 在单元格中写入数据
}
}
}
else {
printf("加载Excel文件失败错误码%d\n", book->errorMessage());
}
book->release();
}*/
}
int LD_FormAttrToExcel(EPM_action_message_t msg) {
printf("开始执行");
int att_cnt = 0;
int doc_num = 0;
tag_t rootTask_tag = NULLTAG;
tag_t task = NULLTAG;
tag_t *attachments = NULLTAG;
tag_t *doc_tags = NULLTAG;
string error;
char *arg = NULL, *argflag = NULL, *argvalue = NULL;
int arg_cnt = TC_number_of_arguments(msg.arguments);
char *include_type = NULL, *relation = NULL, *formtype = NULL, *option = NULL;
task = msg.task;
ITKCALL(EPM_ask_root_task(task, &rootTask_tag));
if (arg_cnt > 0)
{
for (int i = 0; i < arg_cnt; i++)
{
arg = TC_next_argument(msg.arguments);
ITKCALL(ITK_ask_argument_named_value((const char*)arg, &argflag, &argvalue));
if (strcmp(argflag, "include_type") == 0) {
if (argvalue != NULL)
{
printf("获取的值%s:", argvalue);
include_type = argvalue;
}
}
if (strcmp(argflag, "relation") == 0) {
if (argvalue != NULL)
{
printf("获取的值%s:", argvalue);
relation = argvalue;
}
}
if (strcmp(argflag, "formtype") == 0) {
if (argvalue != NULL)
{
printf("获取的值%s:", argvalue);
formtype = argvalue;
}
}
if (strcmp(argflag, "Option") == 0) {
if (argvalue != NULL)
{
printf("获取的值%s:", argvalue);
option = argvalue;
}
}
}
//获取流程下目标关系下的对象
printf("获取流程下目标关系下的对象");
ITKCALL(EPM_ask_attachments(rootTask_tag, EPM_target_attachment, &doc_num, &doc_tags));
for (int i = 0; i < doc_num; i++) {
char *type = NULL;
ITKCALL(AOM_ask_value_string(doc_tags[i], "object_type", &type));
if (strcmp(type, include_type) == 0) {
//查找指定关系
printf("查找指定关系");
int gx_num; tag_t *gx_obj; map<string, string> rowsvalue;
ITKCALL(AOM_ask_value_tags(doc_tags[i], relation, &gx_num, &gx_obj));
for (int j = 0; j < gx_num; j++) {
char *form = NULL;
ITKCALL(AOM_ask_value_string(gx_obj[i], "object_type", &form));
printf("判断是否属于配置类型");
//判断是否属于配置类型
printf("formtype&s\n", formtype);
printf("form&s\n", form);
if (isSubstring(formtype, form)) {
printf("获取表格属性");
//获取表格属性
int rownum; tag_t *tableRownum = NULL;
ITKCALL(AOM_ask_table_rows(gx_obj[i], "ld6_ChangeTable", &rownum, &tableRownum));
printf("读取首选项的值");
int op_nums; char ** op_values = NULL;
PREF_ask_char_values(option, &op_nums, &op_values);
printf("获取表格数据");
printf("表格行数为%d\n", rownum);
printf("首选项行数为%d\n", op_nums);
for (int z = 0; z < rownum; z++) {
printf("1");
string new_str;
printf("2");
for (int a = 0; a < op_nums; a++) {
printf("3");
char *getVal = op_values[a];
printf("4");
int serial_num; tag_t *tableRow = NULL;
printf("5");
if (a == 0) {
printf("6");
printf("表单中的序号属性,获取表单表格的序号");
vector<string> ans;
Split(getVal, ".", ans);
if (ans.size() > 0) {
tag_t rowTag = tableRownum[z];
char *xuhao;
ITKCALL(AOM_ask_value_string(rowTag, ans[2].c_str(), &xuhao));
string pattern = "0(\\d)";
string replacement = "$1";
new_str = regex_replace(xuhao, regex(pattern), replacement);
}
}
else {
printf("后续行格式");
vector<string> ans;
Split(getVal, ".", ans);
if (ans.size() > 1) {
printf("将属性按照=分割");
vector<string> getnas;
Split(ans[2].c_str(), "=", getnas);
tag_t rowTag = tableRownum[z];
char *value;
if (strstr(getnas[0].c_str(), "Time")) {
date_t getdate;
ITKCALL(AOM_ask_value_date(rowTag, getnas[0].c_str(), &getdate));
char fileDate[128] = "";
sprintf_s(fileDate, "%04d-%02d-%02d 00:00", getdate.year, getdate.month + 1, getdate.day);
value = fileDate;
}
else {
ITKCALL(AOM_ask_value_string(rowTag, getnas[0].c_str(), &value));
}
if (value == NULL) {
value = "";
}
if (strcmp(value, "0000-01-00 00:00") == 0) {
value = "";
}
string key = getnas[1] + new_str;
std::string valueStr = value;
std::size_t pos = valueStr.find('\n');
while (pos != std::string::npos) {
valueStr.erase(pos, 1);
pos = valueStr.find('\n', pos);
}
rowsvalue[key.c_str()] = valueStr;
}
else {
//当外层循环走最后一遍的时候,获取表单上的属性
if (z == rownum - 1) {
printf("获取表单属性");
vector<string> getnas;
Split(getVal, "=", getnas);
char *value;
ITKCALL(AOM_ask_value_string(gx_obj[i], getnas[0].c_str(), &value));
if (value == NULL) {
value = "";
}
std::string valueStr = value;
std::size_t pos = valueStr.find('\n');
while (pos != std::string::npos) {
valueStr.erase(pos, 1);
pos = valueStr.find('\n', pos);
}
rowsvalue[getnas[1].c_str()] = valueStr;
}
}
}
}
}
printf("表格数据获取完毕。开始反填excel");
//表格数据获取完毕。开始反填excel
printf("获取规范关系下的excel数据集");
int gf_num; tag_t *gf_obj;
ITKCALL(AOM_ask_value_tags(doc_tags[i], "IMAN_specification", &gf_num, &gf_obj));
printf("获取到了%d个数据集", gf_num);
for (int s = 0; s < gf_num; s++) {
tag_t gettag = gf_obj[s]; char * objtype; char * objname;
ITKCALL(AOM_ask_value_string(gettag, "object_type", &objtype));
ITKCALL(AOM_ask_value_string(gettag, "object_name", &objname));
printf("获取到了%s类型的数据集", objtype);
if (strcmp(objtype, "MSExcelX") == 0) {
printf("获取到了excel数据集");
tag_t ref_object = NULLTAG;
printf("1");
AE_reference_type_t reference_type;
printf("2");
char ref_name[WSO_name_size_c + 1] = "excel";
ITKCALL(AE_ask_dataset_named_ref2(gettag, ref_name, &reference_type, &ref_object));
printf("3");
//printf("reference_type%s", reference_type);
if (reference_type == AE_PART_OF)
{
char *pathname = "";
ITKCALL(IMF_ask_file_pathname2(ref_object, SS_WNT_MACHINE, &pathname));
printf("4");
char *origin_file_name = "";
ITKCALL(IMF_ask_original_file_name2(ref_object, &origin_file_name));
printf("5");
char new_ds_name[WSO_name_size_c + 1] = "";
char *new_file_name = USER_new_file_name(new_ds_name, ref_name, "xlsx", 0);
printf("6");
char *temp_dir = getenv("temp");
printf("7");
char temp_file[SS_MAXPATHLEN] = "";
strcpy(temp_file, "D:\\ldexcel");
strcat(temp_file, "\\");
strcat(temp_file, new_file_name);
printf("temp_file%s", temp_file);
ITKCALL(IMF_export_file(ref_object, temp_file));
printf("8");
printf("开始插入数据");
//string str(temp_file);
insertDataToExcel2(temp_file, rowsvalue);
//挂载数据集
printf("数据插入完成,开始挂载数据集");
ITKCALL(import_dataset_file_binary(gettag, temp_dir, "excel", "xlsx", temp_file, objname));
printf("执行结束");
}
}
}
}
}
}
}
}
return 0;
}