#include "CExcelOpt.h" #include #include #include 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 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