2025-03-14 15:07:39 +08:00
|
|
|
|
#include "CExcelOpt.h"
|
|
|
|
|
|
#include <QFile>
|
|
|
|
|
|
#include <QDir>
|
|
|
|
|
|
#include <QMutexLocker>
|
|
|
|
|
|
|
|
|
|
|
|
CExcelOpt::CExcelOpt(QObject *parent)
|
|
|
|
|
|
: QObject(parent)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_mutex = new QMutex();
|
|
|
|
|
|
|
|
|
|
|
|
m_vecDevXls.resize(6);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CExcelOpt::release()
|
|
|
|
|
|
{
|
|
|
|
|
|
delete this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef OS_WINDOWS
|
|
|
|
|
|
void CExcelOpt::slotUpdateDevXls(const DeviceXlsVector &devXls)
|
|
|
|
|
|
{
|
|
|
|
|
|
QMutexLocker locker(m_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
m_vecDevXls = devXls;
|
|
|
|
|
|
|
|
|
|
|
|
if(m_vecDevXls.size() != 6)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_vecDevXls.resize(6);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CExcelOpt::slotExcelToCsvFile(const QString &excelFileName, const QString &csvFileName, int flag)
|
|
|
|
|
|
{
|
|
|
|
|
|
QMutexLocker locker(m_mutex);
|
|
|
|
|
|
|
|
|
|
|
|
if (!QFile::exists(excelFileName))
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 当pApplication析构的时候会将其所有相关的子对象都清理
|
|
|
|
|
|
QScopedPointer<QAxObject> pApplication(new QAxObject());
|
|
|
|
|
|
|
|
|
|
|
|
// 设置连接Excel控件,需要在GUI的环境下才能成功
|
|
|
|
|
|
bool ok = pApplication->setControl("Excel.Application");
|
|
|
|
|
|
if (!ok)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
emit sigSetValue(5);
|
|
|
|
|
|
|
|
|
|
|
|
pApplication->dynamicCall("SetVisible(bool)", false); // false表示不显示窗体
|
|
|
|
|
|
pApplication->setProperty("DisplayAlerts", false); // false表示不显示(输出)任何警告信息。
|
|
|
|
|
|
emit sigSetValue(10);
|
|
|
|
|
|
|
|
|
|
|
|
QAxObject *pWorkBooks = pApplication->querySubObject("Workbooks"); // Excel工作薄(对象)
|
|
|
|
|
|
if (pWorkBooks == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
emit sigSetValue(15);
|
|
|
|
|
|
|
|
|
|
|
|
QAxObject *pWorkBook = pWorkBooks->querySubObject("Open(const QString &)", excelFileName); // 打开一个Excel文件
|
|
|
|
|
|
if (pWorkBook == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
emit sigSetValue(20);
|
|
|
|
|
|
|
|
|
|
|
|
QAxObject *pSheets = pWorkBook->querySubObject("WorkSheets"); // Excel工作表集
|
|
|
|
|
|
if (pSheets == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
emit sigSetValue(50);
|
|
|
|
|
|
|
|
|
|
|
|
int sheet_count = pSheets->property("Count").toInt(); //获取工作表数目
|
|
|
|
|
|
if(sheet_count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *work_sheet = pSheets->querySubObject("Item(int)", 4); // 得到指定索引的工作表
|
|
|
|
|
|
if (work_sheet == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
emit sigExcelToCsvResult(false, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
emit sigSetValue(60);
|
|
|
|
|
|
|
|
|
|
|
|
// QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
|
|
|
|
|
|
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
|
|
|
|
|
|
QAxObject *rows = used_range->querySubObject("Rows");
|
|
|
|
|
|
QAxObject *columns = used_range->querySubObject("Columns");
|
|
|
|
|
|
//int row_start = used_range->property("Row").toInt(); //获取起始行:1
|
|
|
|
|
|
//int column_start = used_range->property("Column").toInt(); //获取起始列
|
|
|
|
|
|
int lNumRows = rows->property("Count").toInt(); //获取行数
|
|
|
|
|
|
int lNumCols = columns->property("Count").toInt(); //获取列数
|
|
|
|
|
|
emit sigSetValue(65);
|
|
|
|
|
|
|
|
|
|
|
|
int r, c;
|
|
|
|
|
|
for(r=1;r<=lNumRows;r++)
|
|
|
|
|
|
{
|
|
|
|
|
|
for(c=1;c<=lNumCols;c++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(flag == EN_OPEN)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int xx=0;xx<6;xx++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (r== (5 + (xx*7)))
|
|
|
|
|
|
{
|
|
|
|
|
|
char S='S'-'A' + 1;
|
|
|
|
|
|
char U='U'-'A' + 1;
|
|
|
|
|
|
char V='V'-'A' + 1;
|
|
|
|
|
|
|
|
|
|
|
|
if (c==S)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].name =val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==U)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].VB =val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==V)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].VT=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (r== (7 + (xx*7)))
|
|
|
|
|
|
{
|
|
|
|
|
|
char S='S'-'A' + 1;
|
|
|
|
|
|
char T='T'-'A' + 1;
|
|
|
|
|
|
char V='V'-'A' + 1;
|
|
|
|
|
|
char W='W'-'A' + 1;
|
|
|
|
|
|
char X='X'-'A' + 1;
|
|
|
|
|
|
if (c==S)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].CO=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==T)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].t=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==V)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].ts=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==W)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].I=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==X)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
QString val = cell->dynamicCall("Value2()").toString();//获取单元格内容
|
|
|
|
|
|
m_vecDevXls[xx].tt=val;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}else
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int xx=0;xx<6;xx++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (r== (5 + (xx*7)))
|
|
|
|
|
|
{
|
|
|
|
|
|
char S='S'-'A' + 1;
|
|
|
|
|
|
char U='U'-'A' + 1;
|
|
|
|
|
|
char V='V'-'A' + 1;
|
|
|
|
|
|
|
|
|
|
|
|
if (c==S)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].name);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==U)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].VB);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==V)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].VT);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (r== (7 + (xx*7)))
|
|
|
|
|
|
{
|
|
|
|
|
|
char S='S'-'A' + 1;
|
|
|
|
|
|
char T='T'-'A' + 1;
|
|
|
|
|
|
char V='V'-'A' + 1;
|
|
|
|
|
|
char W='W'-'A' + 1;
|
|
|
|
|
|
char X='X'-'A' + 1;
|
|
|
|
|
|
if (c==S)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].CO);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==T)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].t);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==V)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].ts);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==W)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].I);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (c==X)
|
|
|
|
|
|
{
|
|
|
|
|
|
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", r, c);
|
|
|
|
|
|
cell->setProperty("Value2", m_vecDevXls[xx].tt);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QAxObject *pSheet5 = pSheets->querySubObject("Item(int)", 5); // 得到指定索引的工作表
|
|
|
|
|
|
emit sigSetValue(85);
|
|
|
|
|
|
|
|
|
|
|
|
// 另存为文件, 3: txt文件(空格分隔)| 6: csv文件(逗号分隔)
|
|
|
|
|
|
int saveType=44;
|
|
|
|
|
|
if(flag == EN_SAVE)
|
|
|
|
|
|
{
|
|
|
|
|
|
pSheet5->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(csvFileName));
|
|
|
|
|
|
}else
|
|
|
|
|
|
{
|
|
|
|
|
|
pSheet5->dynamicCall("SaveAs(const QString&, int)", QDir::toNativeSeparators(csvFileName), saveType);
|
|
|
|
|
|
}
|
|
|
|
|
|
// pWorkBooks->dynamicCall("SaveAs(const QString&, int)", QDir::toNativeSeparators(csvFileName), 44);
|
|
|
|
|
|
emit sigSetValue(95);
|
|
|
|
|
|
|
|
|
|
|
|
pWorkBooks->dynamicCall("Close(Boolean)", false);//关闭工作簿
|
|
|
|
|
|
pApplication->dynamicCall("Quit(void)");
|
|
|
|
|
|
|
|
|
|
|
|
emit sigSetValue(100);
|
|
|
|
|
|
emit sigExcelToCsvResult(true, csvFileName, m_vecDevXls, flag);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|