diff --git a/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp b/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp index e321af73aa..fcccb0ca1d 100644 --- a/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp +++ b/OOXML/Binary/Sheets/Reader/CellFormatController/DigitReader.cpp @@ -98,18 +98,15 @@ bool DigitReader::ReadDigit(const std::wstring &value, std::wstring &digit, std: { digit = std::to_wstring(dValue); - // Удаление лишних нулей после запятой + // Удаление лишних нулей после запятой size_t dotPos = digit.find('.'); if (dotPos != std::wstring::npos) { size_t lastNonZeroPos = digit.find_last_not_of(L'0'); - if (lastNonZeroPos <= dotPos) - { - digit.erase(lastNonZeroPos + 3); - } + digit.erase(lastNonZeroPos + 2); } - data_format = createFractionFormat(digit, pEndPtr); + data_format = createFractionFormat(digit, pEndPtr); for (size_t i = 0; i < postfix.size(); ++i) { data_format += std::wstring(L"\\") + postfix[i]; diff --git a/OOXML/Binary/Sheets/Reader/XMLReader/XLSXTableController.cpp b/OOXML/Binary/Sheets/Reader/XMLReader/XLSXTableController.cpp index 2db0c12abe..58ced62c36 100644 --- a/OOXML/Binary/Sheets/Reader/XMLReader/XLSXTableController.cpp +++ b/OOXML/Binary/Sheets/Reader/XMLReader/XLSXTableController.cpp @@ -124,6 +124,11 @@ bool CompareCells(const OOX::Spreadsheet::CCell *a, const OOX::Spreadsheet::CCel return *a->m_oCol < *b->m_oCol; } +bool CompareColumns(const OOX::Spreadsheet::CCell *a, const OOX::Spreadsheet::CCell *b) +{ + return *a->m_oCol == *b->m_oCol; +} + _UINT32 XLSXTableController::addRow(OOX::Spreadsheet::CRow *pRow, OOX::Spreadsheet::CWorksheet *pWorkSheet, INT nRow) { if (pWorkSheet->m_oSheetData->m_arrItems.size() > 1048576) @@ -134,9 +139,12 @@ _UINT32 XLSXTableController::addRow(OOX::Spreadsheet::CRow *pRow, OOX::Spreadshe pRow->m_oR->SetValue(nRow); /// сортируем ячейки в ряду - if(pRow->m_arrItems.size() > 2) + if(pRow->m_arrItems.size() > 1) { - std::sort(pRow->m_arrItems.begin(), pRow->m_arrItems.end(), CompareCells); + std::sort(pRow->m_arrItems.begin(), pRow->m_arrItems.end(), CompareCells); + // Удаляем дубликаты с помощью алгоритма unique + auto it = std::unique(pRow->m_arrItems.begin(), pRow->m_arrItems.end(), CompareColumns); + pRow->m_arrItems.erase(it, pRow->m_arrItems.end()); } pWorkSheet->m_oSheetData->m_arrItems.push_back(pRow); diff --git a/OOXML/Binary/Sheets/Reader/XMLReader/XMLConverter2.cpp b/OOXML/Binary/Sheets/Reader/XMLReader/XMLConverter2.cpp index 91d1332798..9ea8c9a758 100644 --- a/OOXML/Binary/Sheets/Reader/XMLReader/XMLConverter2.cpp +++ b/OOXML/Binary/Sheets/Reader/XMLReader/XMLConverter2.cpp @@ -110,10 +110,12 @@ void XMLConverter::ConvertXml(XLSXTableController &table) { table.AddCell(data_.at(i).at(nodeCount), rowNumber, colNames_->GetColumnNumber(i)); } - - for( auto i : writingRows_.at(nodeCount)->attributes) + if(elderNode != writingRows_.at(nodeCount)) { - table.AddCell(data_.at(i).at(nodeCount), rowNumber, colNames_->GetColumnNumber(i)); + for( auto i : writingRows_.at(nodeCount)->attributes) + { + table.AddCell(data_.at(i).at(nodeCount), rowNumber, colNames_->GetColumnNumber(i)); + } } std::set writedColumns = {};