286 lines
11 KiB
C++
286 lines
11 KiB
C++
#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
|