WedX - журнал о программировании и компьютерных науках

Ошибка записи в файл Excel - C++

Когда я отправляю переменную в Excel, она меняет свое значение. Это просто происходит с excel. Это также происходит, когда переменная хранится в контейнере. Я думаю, это более понятно, если вы видите код:

#include<iostream>
#include<array>
#include<vector>
#include<fstream>

const int aSize{ 150000 };
std::array<double, aSize> anArray{};

int main(void)
{
    double aValue{ 0.00000005467 };
    std::vector<double> aVector;
    for (int i = 0; i < aSize; ++i)
    {
        anArray[i] = aValue;
        aVector.push_back(aValue);
    }

    std::ofstream fileOne, fileTwo, fileThree, fileFour, fileFive;
    fileOne.open("array.xls"); 
    fileTwo.open("array.txt");
    fileThree.open("vector.xls");
    fileFour.open("vector.txt");
    fileFive.open("value.xls");

    fileOne << anArray[0];
    fileTwo << anArray[0];
    fileThree << aVector[0];
    fileFour << aVector[0];
    fileFive << aValue;

    std::cout << aValue << "\n" << anArray[0] << "\n" << aVector[0];

    return 0;
}

Все, что я делаю, это заполняю вектор и массив. Если я печатаю значение переменной, я получаю ожидаемое значение. Если я отправлю его в .txt, я получу ожидаемое значение. Если я отправлю только значение в Excel, я получу ожидаемое значение.

Все просто ломается, когда я отправляю значение из контейнеров в Excel. Почему это может происходить?

29.10.2019

  • Может быть, я ошибаюсь, но можете ли вы просто написать в файл .xls, просто используя простой (текстовый) вывод? Я думал, что файлы .xls гораздо сложнее. 29.10.2019
  • @ Адриан Я пробовал .xls, .xlsx, .csv. Все они дают мне тот же результат 29.10.2019
  • Я только что попробовал ваш код и получил одинаковое (правильное) значение во всех пяти файлах. Какой компилятор/платформу вы используете? 29.10.2019
  • Вы получаете тот же порядок величины во всех из них? Они все 5.4e-8? Потому что у меня все равно получается 5.4, но е-5. 29.10.2019
  • @PhysicsPDF вы не можете наивно записывать текст в файл Excel (.xls или .xlsx). 29.10.2019
  • @Jabberwocky Тогда почему это работает, когда я отправляю aVale вместо массива [0]? И у меня такая же проблема с .csv 29.10.2019
  • @Jabberwocky Я тоже так думал, но когда я делаю это и открываю его в Excel, я получаю предупреждение о том, что это нестандартно, но отображаемый лист с одним значением (5.4e-8) в ячейке [0,0] . 29.10.2019
  • Может быть, проблема с интерпретацией десятичной точки (несоответствие точки/запятой)? Проверьте настройки локали для среды Excel и/или C++. 29.10.2019
  • @Adrian, если бы это было причиной проблемы, разве это не произошло бы как для aValue, так и для vector[0]/array[0]? Это происходит только тогда, когда я отправляю напрямую из контейнеров. Что касается компилятора/платформы, я использую последнюю версию Visual Studio для Windows. 29.10.2019
  • Я думаю, что это, вероятно, было бы! Может быть, попробовать сделать aSize (намного) меньше, чтобы увидеть, не проблема ли это с памятью? 29.10.2019
  • Вы можете написать файл .csv и прочитать его в Excel. Наверное, почему это вообще работает, так это .csv, .xls... все они связаны с excel. Когда Excel открывает файл и видит, что содержимое файла не является настоящим xls, он может отступить и попытаться прочитать его как csv. 29.10.2019
  • @ Адриан, я был так уверен, что это проблема с памятью. Я работаю с гораздо большим массивом. Мне никогда не приходило в голову, что это может быть несоответствие точки/запятой, как ни странно, это происходит только с контейнером, а не со значением. Установка обоих на одно и то же соглашение устранила мою проблему. Добавьте свой комментарий в качестве ответа, и я отмечу его как принятый. 29.10.2019
  • Меня до сих пор озадачивает, почему это произошло при отправке напрямую из контейнера, но я так долго боролся, что не буду сейчас в это вникать. Наверное, я делаю какую-то глупость. 29.10.2019
  • @PhysicsPDF Хорошо, как вы были так настойчивы! 29.10.2019
  • Это может помочь кому-то в будущем. Спасибо 29.10.2019

Ответы:


1

Вероятно, здесь проблема заключается в том, как Excel интерпретирует (отформатированный) числовой вывод вашей c++ программы. Даже если текст может быть правильным (с точки зрения функции cout), в нем может не быть «правильного» символа десятичной точки (т. е. точки вместо запятой или наоборот). ).

Решение: Убедитесь, что Excel настроен на использование той же «локали», что и локаль c++ по умолчанию, или установите локаль c++ на ту, которую использует Excel.

29.10.2019
  • Но что меня здесь беспокоит, так это то, почему вызов cout выглядит по-разному для ваших объектов-контейнеров; Я бы подумал, что все пять значений, заданных для <<, будут преобразованы в прямые значения double? 29.10.2019

  • 2

    Формат файла MS-XLS — это не простой текстовый файл. Вы не можете просто поместить в него текст и ожидать, что он отобразится правильно. Вам потребуется больше кода и/или специализированных библиотек для взаимодействия с ним.

    См. предложения здесь.

    29.10.2019
  • https://github.com/jmcnamara/libxlsxwriter.git хороший писатель. Однако он не позволяет добавлять данные в существующий файл Excel. 29.10.2019
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]