读EXCEL的例子,代码片段。写就不说了,写我是直接输出成Office 2003 XML格式的,后缀保存成.xls,简单快速。
QAxObject *excel = NULL;
QAxObject *workbooks = NULL;
QAxObject *workbook = NULL;
QAxObject *sheets = NULL;
QAxObject *sheet = NULL;
QAxObject *range = NULL;
QAxObject *cell = NULL;
excel = new QAxObject("Excel.Application");
if (!excel)
{
QMessageBox::critical(this, "错误信息", "EXCEL对象丢失");
QFile::remove(fileName);
return;
}
excel->dynamicCall("SetVisible(bool)", false);
workbooks = excel->querySubObject("Workbooks");
if (!workbooks)
{
delete excel;
excel = new QAxObject("ET.Application");
if (!excel)
{
QMessageBox::critical(this, "错误信息", "EXCEL对象丢失");
QFile::remove(fileName);
return;
}
excel->dynamicCall("SetVisible(bool)", false);
workbooks = excel->querySubObject("Workbooks");
if (!workbooks)
{
QMessageBox::critical(this, "错误信息", "Workbooks对象丢失");
delete excel;
QFile::remove(fileName);
return;
}
}
workbook = workbooks->querySubObject("Open(QString, QVariant)", fileName, 0);
if (!workbook)
{
QMessageBox::critical(this, "错误信息", "workbook对象丢失");
excel->dynamicCall("Quit()");
delete workbooks;
delete excel;
QFile::remove(fileName);
return;
}
sheets = workbook->querySubObject("Sheets");
if (!sheets)
{
QMessageBox::critical(this, "错误信息", "sheets对象丢失");
excel->dynamicCall("Quit()");
delete workbook;
delete workbooks;
delete excel;
QFile::remove(fileName);
return;
}
int iSheetCnt = sheets->dynamicCall("Count()").toInt();
if (iSheetCnt < 1)
{
QMessageBox::critical(this, "错误信息", "找不到工作表");
excel->dynamicCall("Quit()");
delete sheets;
delete workbook;
delete workbooks;
delete excel;
QFile::remove(fileName);
return;
}
// 读工作表名
QStringList slNames;
for (int i = 1; i <= iSheetCnt; i++)
{
sheet = sheets->querySubObject("Item(int)", i);
slNames << sheet->dynamicCall("Name").toString();
delete sheet;
}
BankToolSetReadRuleExDialog dlg(this);
dlg.setRule(slNames, identity);
if (dlg.exec() == QDialog::Rejected)
{
excel->dynamicCall("Quit()");
delete sheets;
delete workbook;
delete workbooks;
delete excel;
QFile::remove(fileName);
return;
}
RuleConfig rule = dlg.rule();
emit showStatusText(QString("正在读取文件内容......(%1)").arg(fileName));
QApplication::processEvents();
QList<QMap<QString, QString> > *data = &_data;
data->clear();
QMap<QString, QString> map;
QStandardItem *item;
QList<QStandardItem *> items;
_model.removeRows(0, _model.rowCount());
QDate dDate;
QString strV, strV2;
QString strDate;
QString strError;
for (int i = 0; i < rule.workSheets.size(); i++)
{
sheet = sheets->querySubObject("Item(int)", rule.workSheets);
if (!sheet)
{
strError += "读取工作表" + slNames[rule.workSheets - 1]
+ "失败;";
continue;
}
sheet->dynamicCall("Select()");
int iRow = rule.startRow;
while (true)
{
map.clear();
// 读取日期//{{{
range = sheet->querySubObject("Cells(int, int)", iRow, rule.dateCol);
dDate = range->dynamicCall("Value()").toDate();
strDate = range->dynamicCall("Value()").toString().trimmed();
delete range;
if (!dDate.isValid())
{
if (strDate.size() == 8)
{
dDate = QDate::fromString(strDate, "yyyyMMdd");
if (!dDate.isValid())
{
break;
}
}
else if (strDate.size() == 10)
{
if (strDate.indexOf("/") > -1)
{
dDate = QDate::fromString(strDate, "yyyy/MM/dd");
if (!dDate.isValid())
{
break;
}
}
else
{
break;
}
}
else
{
break;
}
}
if (dDate < dateEditStart->date() || dDate > dateEditEnd->date())
{
iRow++;
continue;
}
if (dDate.toString("yyyy") != _strYear)
{
iRow++;
continue;
}
map["date"] = dDate.toString("yyyy-MM-dd");
item = new QStandardItem(map["date"]);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
items.push_back(item);
//}}}
// 读取凭证号//{{{
if (rule.usedCNID)
{
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.CNIDCol);
strV = range->dynamicCall("Value()").toString().trimmed();
delete range;
if (strV == "0")
{
strV = "";
}
else
{
if (rule.CNIDPos < 0)
{
strV = strV.mid(strV.length() + rule.CNIDPos,
rule.CNIDLen);
}
else
{
strV = strV.mid(rule.CNIDPos, rule.CNIDLen);
}
}
map["cn_id"] = strV; //凭证号
item = new QStandardItem(strV);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
}
else
{
item = new QStandardItem("");
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
}
//}}}
// 读取交易金额//{{{
if (rule.moneyByCol)
{
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.moneyJieCol);
strV = range->dynamicCall("Value()").toString().trimmed();
strV = QString::number(
strV.replace(",", "").toDouble(), 'f', 2);
delete range;
map["debitmoney"] = strV; //借方
if (strV == "0.00")
{
strV = "";
}
item = new QStandardItem(strV);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.moneyDaiCol);
strV = range->dynamicCall("Value()").toString().trimmed();
strV = QString::number(
strV.replace(",", "").toDouble(), 'f', 2);
delete range;
map["lendermoney"] = strV; //贷方
if (strV == "0.00")
{
strV = "";
}
item = new QStandardItem(strV);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
strV = map["debitmoney"].toDouble() < 0.01 ? "贷" : "借";
map["bdc"] = strV;
item = new QStandardItem(strV);
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
items.insert(2, item);
}
else // moneybyType
{
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.moneyTypeCol);
strV = range->dynamicCall("Value()").toString().trimmed();
delete range;
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.moneyCol);
strV2 = range->dynamicCall("Value()").toString().trimmed();
delete range;
strV2 = QString::number(strV2.replace(",", "").toDouble(), 'f', 2);
if (strV == rule.jieLabel)
{
// 贷
map["lendermoney"] = "";
// 借
map["debitmoney"] = strV2;
}
else
{
// 贷
map["lendermoney"] = strV2;
// 借
map["debitmoney"] = "";
}
item = new QStandardItem(map["debitmoney"]);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
item = new QStandardItem(map["lendermoney"]);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
item = new QStandardItem(strV == rule.jieLabel ? "借" : "贷");
item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
items.insert(2, item);
}//}}}
// 读取结算方式//{{{
if (rule.usedJSFS)
{
range = sheet->querySubObject("Cells(int, int)", iRow,
rule.JSFSCol);
strV = range->dynamicCall("Value()").toString().trimmed();
delete range;
map["csettle"] = strV; //凭证号
item = new QStandardItem(strV);
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
}
else
{
map["csettle"] = "";
item = new QStandardItem("");
item->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
items.push_back(item);
}
//}}}
_model.appendRow(items);
items.clear();
data->append(map);
iRow++;
}
delete sheet;
}
excel->dynamicCall("Quit()");
delete sheets;
delete workbook;
delete workbooks;
delete excel;