2025-03-17 14:25:29 +08:00

286 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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