286 lines
11 KiB
C++
Raw Normal View History

2025-03-17 13:44:44 +08:00
#include "CExcelOpt.h"
2025-03-14 17:05:48 +08:00
#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