studentpage.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. #include "studentpage.h"
  2. #include "appevent.h"
  3. #include "cwf/sqlquerymanager.h"
  4. #include "qcombobox.h"
  5. #include "qjsonarray.h"
  6. #include "qjsonvalue.h"
  7. #include "qnamespace.h"
  8. #include "tmodel.h"
  9. #include "widgets/pagination.h"
  10. #include "widgets/studentmodel.h"
  11. #include <QCheckBox>
  12. #include <QComboBox>
  13. #include <QDialog>
  14. #include <QHeaderView>
  15. #include <QLabel>
  16. #include <QLineEdit>
  17. #include <QPainter>
  18. #include <QStatusBar>
  19. #include <QStyledItemDelegate>
  20. #include <QTableView>
  21. #include <xlsxdocument.h>
  22. #include <QFileDialog>
  23. #include <QJsonArray>
  24. #include <QMessageBox>
  25. #include <layoutbuilder.h>
  26. #include "cwf/sqlquery.h"
  27. #include <cwf/constants.h>
  28. #include <cwf/cppwebapplication.h>
  29. #include <cwf/filter.h>
  30. #include <cwf/sqldatabasestorage.h>
  31. #include "teachertr.h"
  32. static CWF::SqlDatabaseStorage storage("QSQLITE", "localhost", "data.db", "", "");
  33. class TagDelegate : public QStyledItemDelegate
  34. {
  35. public:
  36. TagDelegate(QObject *parent = nullptr)
  37. : QStyledItemDelegate(parent)
  38. {}
  39. void paint(QPainter *painter,
  40. const QStyleOptionViewItem &option,
  41. const QModelIndex &index) const override
  42. {
  43. QStyledItemDelegate::paint(painter, option, index);
  44. // 获取数据
  45. QString tagText = index.data(Qt::DisplayRole).toString();
  46. QColor color = Qt::lightGray;
  47. if (tagText == "1") {
  48. tagText = TeacherServer::Tr::tr("online");
  49. color = Qt::green;
  50. } else {
  51. tagText = TeacherServer::Tr::tr("outline");
  52. }
  53. // 设置背景色和边框
  54. painter->save();
  55. painter->setRenderHint(QPainter::Antialiasing);
  56. painter->setPen(Qt::NoPen);
  57. painter->setBrush(color); // 背景色
  58. painter->drawRoundedRect(option.rect.adjusted(2, 2, -2, -2), 5, 5); // 圆角矩形
  59. // 设置文本颜色和对齐方式
  60. painter->setPen(QColor("#0078D4")); // 文本颜色
  61. painter->setFont(QFont("Arial", 10));
  62. painter->drawText(option.rect.adjusted(5, 2, -5, -2), Qt::AlignCenter, tagText);
  63. painter->restore();
  64. }
  65. QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
  66. {
  67. // 返回标签的合适大小
  68. QString tagText = index.data(Qt::DisplayRole).toString();
  69. QFontMetrics fm(option.font);
  70. QSize size = fm.size(0, tagText);
  71. return size + QSize(10, 4); // 调整大小,以适应内容
  72. }
  73. };
  74. StudentPage::StudentPage(QWidget *parent)
  75. : QWidget{parent}
  76. {
  77. using namespace Layouting;
  78. studentView = new QTableView;
  79. pagination = new Pagination;
  80. pageSize = new QComboBox;
  81. pageSize->addItem("10", 10);
  82. pageSize->addItem("20", 20);
  83. pageSize->addItem("30", 30);
  84. pageSize->addItem("50", 50);
  85. pageSize->addItem("100", 100);
  86. studentNameLineEdit = new QLineEdit;
  87. studentSwLineEdit = new QLineEdit;
  88. examineeNumberLineEdit = new QLineEdit;
  89. checkinNumberLineEdit = new QLineEdit;
  90. examsTestLineEdit = new QLineEdit;
  91. groupNameComboBox = new QComboBox;
  92. groupNameComboBox->addItem("小学");
  93. groupNameComboBox->addItem("初中");
  94. groupNameComboBox->addItem("高中");
  95. auto studentEditor = Form{tr("name"),
  96. studentNameLineEdit,
  97. br,
  98. tr("swID"),
  99. studentSwLineEdit,
  100. br,
  101. tr("examinee number"),
  102. examineeNumberLineEdit,
  103. noMargin()}
  104. .emerge();
  105. auto studentEditorRight = Form{tr("checkin number"),
  106. checkinNumberLineEdit,
  107. br,
  108. tr("group name"),
  109. groupNameComboBox,
  110. br,
  111. tr("exams test"),
  112. examsTestLineEdit,
  113. noMargin()}
  114. .emerge();
  115. auto op = Column{PushButton{text(tr("Add")), onClicked([this]() { addStudent(); })},
  116. PushButton{text(tr("Remove")), onClicked([this]() { removeStudent(); })},
  117. PushButton{text(tr("Set as Offline")), onClicked([this]() { setOffline(); })},
  118. st,
  119. PushButton{text(tr("Clear...")), onClicked([this]() { Clear(); })},
  120. PushButton{text(tr("Import...")), onClicked([this]() { importFile(); })},
  121. PushButton{text(tr("Export...")), onClicked([this]() { exportFile(); })},
  122. st,
  123. PushButton{text(tr("Save")), onClicked([this]() { save(); })}}
  124. .emerge();
  125. // examsEditor->setMinimumWidth(300);
  126. op->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
  127. auto pageWidget = Row{pagination, st, tr("pageSize"), pageSize, st};
  128. Row{Column{studentView, pageWidget, Row{studentEditor, studentEditorRight}}, op}.attachTo(this);
  129. // 创建数据模型
  130. StudentTableModel *model = new StudentTableModel;
  131. // 创建表格视图
  132. studentView->setModel(model);
  133. studentView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
  134. studentView->setSelectionBehavior(QAbstractItemView::SelectRows);
  135. studentView->setSelectionMode(QAbstractItemView::SingleSelection);
  136. studentView->setItemDelegateForColumn(StudentTableModel::STATE,
  137. new TagDelegate(this)); // 设置第0列应用委托
  138. AppEvent *appEvent = AppEvent::instance();
  139. // 连接信号和槽
  140. QObject::connect(appEvent, &AppEvent::loginUserSignal, [this](int) { updateStudentView(); });
  141. QObject::connect(appEvent, &AppEvent::loginOutUserSignal, [this](int) { updateStudentView(); });
  142. QObject::connect(pagination, &Pagination::valueChanged, [this](int) { updateStudentView(); });
  143. QObject::connect(pageSize, &QComboBox::currentTextChanged, [this](const QString &) {
  144. updateStudentView();
  145. });
  146. connect(studentView, &QTableView::clicked, this, [=](const QModelIndex &index) {
  147. StudentTableModel *model = qobject_cast<StudentTableModel *>(studentView->model());
  148. StudentTableModel::Student student = model->getCurrentStudent(index);
  149. studentNameLineEdit->setText(student.name);
  150. studentSwLineEdit->setText(student.swID);
  151. examineeNumberLineEdit->setText(student.examineeNumber);
  152. checkinNumberLineEdit->setText(student.checkinNumber);
  153. groupNameComboBox->setCurrentText(student.groupName);
  154. examsTestLineEdit->setText(student.examTest);
  155. });
  156. QObject::connect(appEvent, &AppEvent::beginExamSignal, [this]() {
  157. pagination->setCurrentPage(1);
  158. });
  159. updateStudentView();
  160. }
  161. void StudentPage::updateStudentView()
  162. {
  163. int size = pageSize->currentData().toInt();
  164. pagination->setPageSizes(size);
  165. UserModel userModel(storage);
  166. StudentTableModel *model = qobject_cast<StudentTableModel *>(studentView->model());
  167. CWF::SqlQueryManager queryManager(storage);
  168. queryManager.select("COUNT(*) AS total", userModel.getTableName());
  169. queryManager.exec(queryManager.getQueryText());
  170. QJsonArray array = queryManager.toJson();
  171. if (!array.isEmpty()) {
  172. QJsonObject object = array[0].toObject();
  173. qint64 total = object["total"].toVariant().toLongLong();
  174. pagination->setTotal(total);
  175. }
  176. int pageNumber = pagination->currentPage();
  177. int pageSize = pagination->pageSizes();
  178. QString queryStr = QString("SELECT * FROM %1 LIMIT %2 OFFSET %3")
  179. .arg(userModel.getTableName())
  180. .arg(pageSize)
  181. .arg((pageNumber - 1) * pageSize);
  182. queryManager.exec(queryStr);
  183. model->loadJsonData(queryManager.toJson());
  184. }
  185. void StudentPage::addStudent()
  186. {
  187. UserModel userModel(storage);
  188. CWF::SqlQueryManager queryManager(storage);
  189. queryManager.insert(userModel.getTableName(), "name,swID,state,examineeNumber,maxTime");
  190. queryManager.prepare();
  191. queryManager.addBindValue("");
  192. queryManager.addBindValue("");
  193. queryManager.addBindValue("0");
  194. queryManager.addBindValue("");
  195. queryManager.addBindValue(0);
  196. QJsonObject status = queryManager.exec();
  197. if (status["success"].toBool()) {
  198. updateStudentView();
  199. }
  200. }
  201. void StudentPage::setOffline()
  202. {
  203. StudentTableModel *model = qobject_cast<StudentTableModel *>(studentView->model());
  204. const QModelIndex index = studentView->currentIndex();
  205. StudentTableModel::Student student = model->getCurrentStudent(index);
  206. if (student.id == 0) {
  207. return;
  208. }
  209. UserModel userModel(storage);
  210. CWF::SqlQueryManager queryManager(storage);
  211. //queryManager.select("*", examsModel.getTableName()).where("isSelect = ?");
  212. queryManager.update(userModel.getTableName(), "state = 0");
  213. queryManager.where("id = ?");
  214. queryManager.prepare();
  215. queryManager.addBindValue(student.id);
  216. QJsonObject status = queryManager.exec();
  217. if (status["success"].toBool()) {
  218. updateStudentView();
  219. studentView->setCurrentIndex(index);
  220. }
  221. }
  222. void StudentPage::removeStudent()
  223. {
  224. StudentTableModel *model = qobject_cast<StudentTableModel *>(studentView->model());
  225. const QModelIndex index = studentView->currentIndex();
  226. StudentTableModel::Student student = model->getCurrentStudent(index);
  227. if (student.id == 0) {
  228. return;
  229. }
  230. UserModel userModel(storage);
  231. CWF::SqlQueryManager queryManager(storage);
  232. //queryManager.select("*", examsModel.getTableName()).where("isSelect = ?");
  233. queryManager.remove(userModel.getTableName(), "id = ?");
  234. queryManager.prepare();
  235. queryManager.addBindValue(student.id);
  236. QJsonObject status = queryManager.exec();
  237. if (status["success"].toBool()) {
  238. updateStudentView();
  239. studentView->setCurrentIndex(index);
  240. }
  241. }
  242. void StudentPage::save()
  243. {
  244. StudentTableModel *model = qobject_cast<StudentTableModel *>(studentView->model());
  245. const QModelIndex index = studentView->currentIndex();
  246. StudentTableModel::Student student = model->getCurrentStudent(index);
  247. if (student.id == 0) {
  248. return;
  249. }
  250. UserModel userModel(storage);
  251. CWF::SqlQueryManager queryManager(storage);
  252. queryManager
  253. .update(userModel.getTableName(),
  254. "name=?,swID=?,state=?,examineeNumber=?,checkinNumber=?,groupName=?,examTest=?")
  255. .where("id = ?");
  256. queryManager.prepare();
  257. queryManager.addBindValue(studentNameLineEdit->text());
  258. queryManager.addBindValue(studentSwLineEdit->text());
  259. queryManager.addBindValue("0");
  260. queryManager.addBindValue(examineeNumberLineEdit->text());
  261. queryManager.addBindValue(checkinNumberLineEdit->text());
  262. queryManager.addBindValue(groupNameComboBox->currentText());
  263. queryManager.addBindValue(examsTestLineEdit->text());
  264. queryManager.addBindValue(student.id);
  265. QJsonObject status = queryManager.exec();
  266. if (status["success"].toBool()) {
  267. updateStudentView();
  268. studentView->setCurrentIndex(index);
  269. }
  270. }
  271. void StudentPage::Clear()
  272. {
  273. QMessageBox msgBox;
  274. msgBox.setInformativeText(QString(tr("This will clear up all grades and student information")));
  275. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  276. msgBox.setDefaultButton(QMessageBox::Ok);
  277. msgBox.setButtonText(QMessageBox::Ok, tr("OK"));
  278. msgBox.setButtonText(QMessageBox::Cancel, tr("Cancel"));
  279. int ret = msgBox.exec();
  280. if (ret == QMessageBox::Ok) {
  281. CWF::SqlQueryManager queryManager(storage);
  282. queryManager.exec("DELETE FROM user;");
  283. queryManager.exec("DELETE FROM exams_test;");
  284. }
  285. // 清理学生信息
  286. updateStudentView();
  287. // 通知成绩信息更新
  288. AppEvent::instance()->examsTestUpdate();
  289. }
  290. void StudentPage::importFile()
  291. {
  292. QString filePath = QFileDialog::getOpenFileName(nullptr,
  293. tr("file"),
  294. "",
  295. "xlsx Files (*.xlsx);;All Files (*)");
  296. // 如果用户选择了文件,输出文件路径
  297. if (filePath.isEmpty()) {
  298. return;
  299. }
  300. QXlsx::Document xlsx = QXlsx::Document(filePath);
  301. // xlsx.currentSheet();
  302. int nameIndex = -1;
  303. int SWIDIndex = -1;
  304. int examineeNumberIndex = -1;
  305. int examTestIndex = -1;
  306. int groupIndex = -1;
  307. int maxTimeIndex = -1;
  308. int timeIndex = -1;
  309. int AnswerFileNameIndex = -1;
  310. int checkinNumberIndex = -1;
  311. int schoolIndex = -1;
  312. for (int col = 0; col < 20; ++col) {
  313. QVariant value = xlsx.read(1, col);
  314. QString strValue = value.toString();
  315. qDebug() << col << strValue;
  316. if (strValue == "\xE5\xA7\x93\xE5\x90\x8D") { // UTF-8 编码的 "姓名"
  317. nameIndex = col;
  318. } else if (strValue == "\x53\x57\x5F\x49\x44") { // UTF-8 编码的 "SW_ID"
  319. SWIDIndex = col;
  320. } else if (strValue == "\xE8\x80\x83\xE8\xAF\x95\xE7\xBC\x96\xE5\x8F\xB7"
  321. || strValue == "赛队编号") { // UTF-8 编码的 "考试编号"
  322. examineeNumberIndex = col;
  323. } else if (strValue
  324. == "\xE8\x80\x83\xE8\xAF\x95\xE5\x86\x85\xE5\xAE\xB9") { // UTF-8 编码的 "考试内容"
  325. examTestIndex = col;
  326. } else if (strValue == "\xE7\xBB\x84\xE5\x88\xAB") { // UTF-8 编码的 "组别"
  327. groupIndex = col;
  328. } else if (strValue
  329. == "\xE6\x9C\x80\xE5\xA4\xA7\xE5\xAE\x8C\xE6\x88\x90\xE6\x97\xB6\xE9\x97"
  330. "\xB4") { // UTF-8 编码的 "最大完成时间"
  331. maxTimeIndex = col;
  332. } else if (strValue
  333. == "\xE5\xAE\x8C\xE6\x88\x90\xE6\x97\xB6\xE9\x97\xB4") { // UTF-8 编码的 "完成时间"
  334. timeIndex = col;
  335. } else if (strValue
  336. == "\xE7\xAD\x94\xE6\xA1\x88\xE6\x96\x87\xE4\xBB\xB6\xE5\x90\x8D\xE7\xA7"
  337. "\xB0") { // UTF-8 编码的 "答案文件名称"
  338. AnswerFileNameIndex = col;
  339. } else if (strValue == "\347\255\276\345\210\260\345\217\267"
  340. || strValue == "座位号") { // UTF-8 编码的 "签到号"
  341. checkinNumberIndex = col;
  342. } else if (strValue == "\345\255\246\346\240\241") { // UTF-8 编码的 "学校"
  343. schoolIndex = col;
  344. }
  345. }
  346. UserModel userModel(storage);
  347. for (int row = 2;; ++row) {
  348. QVariant nameValue = xlsx.read(row, nameIndex);
  349. QVariant SWIDValue = xlsx.read(row, SWIDIndex);
  350. QVariant examineeNumberValue = xlsx.read(row, examineeNumberIndex);
  351. QVariant examTestValue = xlsx.read(row, examTestIndex);
  352. QVariant groupNameValue = xlsx.read(row, groupIndex);
  353. QVariant maxTimeValue = xlsx.read(row, maxTimeIndex);
  354. QVariant timeValue = xlsx.read(row, timeIndex);
  355. QVariant AnswerFileNameValue = xlsx.read(row, AnswerFileNameIndex);
  356. QVariant checkinNumberValue = xlsx.read(row, checkinNumberIndex);
  357. QVariant schoolValue = xlsx.read(row, schoolIndex);
  358. if (nameValue.isNull() && SWIDValue.isNull() && examineeNumberValue.isNull()
  359. && examTestValue.isNull() && groupNameValue.isNull() && maxTimeValue.isNull()
  360. && timeValue.isNull() && AnswerFileNameValue.isNull() && checkinNumberValue.isNull()) {
  361. break;
  362. }
  363. qDebug() << "Row:" << row //
  364. << "Name:" << nameValue.toString() //
  365. << "SWID:" << SWIDValue.toString() //
  366. << "Examinee Number:" << examineeNumberValue.toString() //
  367. << "Exam Test:" << examTestValue.toString() //
  368. << "Group:" << groupNameValue.toString() //
  369. << "Max Time:" << maxTimeValue.toString() //
  370. << "Time:" << timeValue.toString() //
  371. << "Answer File Name:" << AnswerFileNameValue.toString() //
  372. << "checkin Number Value" << checkinNumberValue.toString();
  373. if (nameValue.isNull()) {
  374. // 错误处理
  375. }
  376. // 考试编号 和 SW_ID 必须存在一个
  377. if (examineeNumberValue.isNull() && SWIDValue.isNull()) {
  378. // 错误处理
  379. continue;
  380. }
  381. CWF::SqlQueryManager queryManager(storage);
  382. queryManager.insert(
  383. userModel.getTableName(),
  384. "name,swID,examineeNumber,examTest,groupName,maxTime,checkinNumber,school,state");
  385. queryManager.prepare();
  386. queryManager.addBindValue(nameValue.toString());
  387. queryManager.addBindValue(SWIDValue.toString());
  388. queryManager.addBindValue(examineeNumberValue.toString());
  389. queryManager.addBindValue(examTestValue.toString());
  390. queryManager.addBindValue(groupNameValue.toString());
  391. queryManager.addBindValue(maxTimeValue.toInt());
  392. queryManager.addBindValue(checkinNumberValue.toString());
  393. queryManager.addBindValue(schoolValue.toString());
  394. queryManager.addBindValue("0");
  395. QJsonObject status = queryManager.exec();
  396. if (status["success"].toBool()) {
  397. updateStudentView();
  398. }
  399. }
  400. }
  401. void StudentPage::exportFile()
  402. {
  403. QString filePath = QFileDialog::getSaveFileName(nullptr,
  404. tr("file"),
  405. "",
  406. "xlsx Files (*.xlsx);;All Files (*)");
  407. // 如果用户选择了文件,输出文件路径
  408. if (filePath.isEmpty()) {
  409. return;
  410. }
  411. QXlsx::Document xlsx = QXlsx::Document(filePath);
  412. int nameIndex = 1;
  413. int SWIDIndex = 2;
  414. int examineeNumberIndex = 3;
  415. int examTestIndex = 4;
  416. int groupIndex = 5;
  417. int maxTimeIndex = 6;
  418. int timeIndex = 7;
  419. int AnswerFileNameIndex = 8;
  420. int checkinNumberIndex = 9; //
  421. int timeSecondIndex = 10;
  422. int schoolIndex = 11;
  423. QStringList colName = {
  424. "",
  425. "\xE5\xA7\x93\xE5\x90\x8D", // UTF-8 编码的 "姓名"
  426. "\x53\x57\x5F\x49\x44", // UTF-8 编码的 "SW_ID"
  427. "\xE8\x80\x83\xE8\xAF\x95\xE7\xBC\x96\xE5\x8F\xB7", // UTF-8 编码的 "考试编号"
  428. "\xE8\x80\x83\xE8\xAF\x95\xE5\x86\x85\xE5\xAE\xB9", // UTF-8 编码的 "考试内容"
  429. "\xE7\xBB\x84\xE5\x88\xAB", // UTF-8 编码的 "组别"
  430. "\xE6\x9C\x80\xE5\xA4\xA7\xE5\xAE\x8C\xE6\x88\x90\xE6\x97\xB6\xE9\x97\xB4", // UTF-8 编码的 "最大完成时间"
  431. "\xE5\xAE\x8C\xE6\x88\x90\xE6\x97\xB6\xE9\x97\xB4", // UTF-8 编码的 "完成时间"
  432. "\xE7\xAD\x94\xE6\xA1\x88\xE6\x96\x87\xE4\xBB\xB6\xE5\x90\x8D\xE7\xA7\xB0", // UTF-8 编码的 "答案文件名称"
  433. "\347\255\276\345\210\260\345\217\267", // UTF-8 编码的 "签到号"
  434. "\347\247\222", // 秒
  435. "\345\255\246\346\240\241" // 学校
  436. };
  437. for (int col = 1; col < colName.size(); ++col) {
  438. QVariant value = xlsx.read(1, col);
  439. QString strValue = value.toString();
  440. xlsx.write(1, col, colName[col]);
  441. }
  442. UserModel userModel(storage);
  443. CWF::SqlQueryManager queryManager(storage);
  444. queryManager.select("*", userModel.getTableName());
  445. int row = 2;
  446. QJsonObject status = queryManager.exec(queryManager.getQueryText());
  447. if (status["success"].toBool()) {
  448. const QJsonArray jsonArray = queryManager.toJson();
  449. for (const QJsonValue &json : jsonArray) {
  450. const QJsonObject &object = json.toObject();
  451. // QString name; // 姓名
  452. // QString swID; // SW_ID
  453. // QString state; // 在线状态
  454. // QString examineeNumber; // 考试编号
  455. // QString examTest; // 考试内容
  456. // QString checkinNumber; // 签到号
  457. // QString groupName; // 组别
  458. // int maxTime; // 最大完成时间
  459. // int answerTime; // 完成时间
  460. // QString answerFileName; // 完成时间
  461. QString name = object["name"].toString(); // 姓名
  462. QString swID = object["SW_ID"].toString(); // SW_ID
  463. QString state = object["state"].toString(); // 在线状态
  464. QString examineeNumber = object["examineeNumber"].toString(); // 考试编号
  465. QString examTest = object["examTest"].toString(); // 考试内容
  466. QString checkinNumber = object["checkinNumber"].toString(); // 签到号
  467. QString groupName = object["groupName"].toString(); // 组别
  468. int maxTime = object["maxTime"].toInt(); // 最大完成时间
  469. int answerTime = object["answerTime"].toInt(); // 完成时间
  470. QString answerFileName = object["answerFileName"].toString(); // 答案文件名称
  471. QString school = object["school"].toString(); // 答案文件名称
  472. // Writing data to Excel file
  473. xlsx.write(row, nameIndex, name);
  474. xlsx.write(row, SWIDIndex, swID);
  475. xlsx.write(row, examineeNumberIndex, examineeNumber);
  476. xlsx.write(row, examTestIndex, examTest);
  477. xlsx.write(row, groupIndex, groupName);
  478. xlsx.write(row, maxTimeIndex, maxTime);
  479. xlsx.write(row, timeIndex, answerTime);
  480. xlsx.write(row, AnswerFileNameIndex, answerFileName);
  481. xlsx.write(row, checkinNumberIndex, checkinNumber);
  482. xlsx.write(row, timeSecondIndex, int(answerTime / 1000));
  483. xlsx.write(row, schoolIndex, school);
  484. row++;
  485. }
  486. }
  487. xlsx.save();
  488. }