Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
1

Прочитать данные из xlsx файла и записать в другой файл

30.01.2015, 15:25. Показов 3980. Ответов 10
Метки нет (Все метки)

Всем бодрой пятнички!
Соскучилась я за вами, потому обращаюсь с вопросом.

Всегда была слаба в теме работы с файлами. А тут как раз подвернулась задачка, в которой нужно прочитать данные из xlsx файла и записать в другой файл. И вот уже при первой пробе возники трудности...
Следующий код выдает бесконечную последовательность "мусора"... Подскажите, кто знает, как правильно считать данные?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream> 
#include <fstream>
 
using namespace std;
 
int main() 
{
    ifstream f;
    const char *file_name = "test.xlsx";
    f.open(file_name, ios::in);
    int tmp;
    if (f)
        while(!f.eof())
        {
            f >> tmp;
            std::cout << tmp;
        }
    else
        std::cout << "Error reading file";
    system("pause>>null");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2015, 15:25
Ответы с готовыми решениями:

Из текстового файла прочитать четные числа и записать их в другой файл (С++)
Из текстового файла прочитать четные числа и записать их в другой файл без использования массива...

Из текстового файла прочитать четные числа и записать их в другой файл без использования массива (код С++)
Код есть только перед чтением файла нужно его создать, внести 15 чисел и закрыть, через ofstream. ...

Как из файла записать данные в другой файл?
странная задача, но все же надо открыть файл, прочитать и переписать их в другой файл...

Записать в файл F слова. Прочитать данные из файла и найти слова из 5 букв
Записать в файл F слова. Прочитать данные из файла и найти слова из 5 букв Не получается...

10
74 / 34 / 17
Регистрация: 24.07.2014
Сообщений: 357
30.01.2015, 15:34 2
а что написано в файле?
0
7 / 7 / 3
Регистрация: 23.12.2014
Сообщений: 94
30.01.2015, 15:57 3
у меня тоже самое было, в borland делается все легко (на форму добавишь StringGrid):
C++
1
2
3
4
5
6
7
8
9
10
11
UnicodeString a= "путь к файлу";
Variant cnn ;
 
cnn = CreateOleObject("EXCEL.Application");
 
cnn.OlePropertyGet("Workbooks").OlePropertyGet("Open",a.c_str());
 
this->StringGrid1->Cells[y][x] = cnn.OlePropertyGet("Cells",x,y);
//y и x это номер колонки и строки
  
cnn.OlePropertyGet("Workbooks").OlePropertyGet("Close",a.c_str());
0
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.01.2015, 16:20  [ТС] 4
BlackOwl, спасибо!
Но у меня студия.

Добавлено через 28 секунд
Цитата Сообщение от Справлюсь Посмотреть сообщение
а что написано в файле?
Пара колонок заполнена интами. И всё.
0
В астрале
Эксперт С++
8032 / 4789 / 655
Регистрация: 24.06.2010
Сообщений: 10,558
30.01.2015, 16:32 5
Тамика, xlsx так просто не считаешь. Либо через офис, либо через либу, которая способна переварить данный формат.
1
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
30.01.2015, 16:35  [ТС] 6
ForEveR, да... Много проблем. Но я хочу попробовать ещё через csv.
0
7 / 7 / 3
Регистрация: 23.12.2014
Сообщений: 94
31.01.2015, 09:56 7
Тамика, в Visual studio нет встроеных библиотек для работы с файлами офиса, так что тут либо искать готовые библиотеки либо все пытаться сделать самому, но корректного ответа как сделать все самому я нигде не нашел(сам задавался этим вопросом)
0
63 / 63 / 77
Регистрация: 22.11.2012
Сообщений: 241
Записей в блоге: 1
31.01.2015, 10:33 8
http://rsdn.ru/forum/cpp.applied/4173549.all
0
:)
Эксперт С++
4766 / 3260 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.01.2015, 10:36 9
Цитата Сообщение от BlackOwl Посмотреть сообщение
но корректного ответа как сделать все самому я нигде не нашел
https://msdn.microsoft.com/en-... 12%29.aspx
0
7 / 7 / 3
Регистрация: 23.12.2014
Сообщений: 94
31.01.2015, 10:40 10
Tulosba,
Цитата Сообщение от Tulosba Посмотреть сообщение
https://msdn.microsoft.com/en-us/lib...ice.12%29.aspx
я еще с с++ на вы, так что как это все реализовать я еще не знаю
0
2226 / 1729 / 865
Регистрация: 21.12.2010
Сообщений: 3,073
Записей в блоге: 11
31.01.2015, 16:14 11
Читает ячейки a1 и a2 при условии что там записаны слова (не числа). Путь к файлу c:\\1.xlsx
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <stdio.h>
#include <windows.h>
#include <ole2.h>
#include <string>
#include <stdexcept>
 
#pragma comment(lib, "libuuid")
#pragma comment(lib, "libole32")
#pragma comment(lib, "liboleaut32")
 
// AutoWrap() - Automation helper function...
HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
    // Begin variable-argument list...
    va_list marker;
    va_start(marker, cArgs);
 
    if(!pDisp) {
        MessageBox(NULL, "NULL IDispatch passed to AutoWrap()", "Error", 0x10010);
        _exit(0);
    }
 
    // Variables used...
    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    char buf[200];
    char szName[200];
 
 
    // Convert down to ANSI
    WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
 
    // Get DISPID for name passed...
    hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
        MessageBox(NULL, buf, "AutoWrap()", 0x10010);
        _exit(0);
        return hr;
    }
 
    // Allocate memory for arguments...
    VARIANT *pArgs = new VARIANT[cArgs+1];
    // Extract arguments...
    for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }
 
    // Build DISPPARAMS
    dp.cArgs = cArgs;
    dp.rgvarg = pArgs;
 
    // Handle special-case for property-puts!
    if(autoType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }
 
    // Make the call!
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) {
        sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
        MessageBox(NULL, buf, "AutoWrap()", 0x10010);
        _exit(0);
        return hr;
    }
    // End variable-argument section...
    va_end(marker);
 
    delete [] pArgs;
 
    return hr;
}
//------------------------------------------------------------------------------
 
int main()
{
     // Initialize COM for this thread...
   CoInitialize(NULL);
 
   // Get CLSID for our server...
   CLSID clsid;
   HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
 
   if(FAILED(hr)) {
 
      ::MessageBox(NULL, "CLSIDFromProgID() failed", "Error", 0x10010);
      return __LINE__;
   }
 
   // Start server and get IDispatch...
   IDispatch *pXlApp;
   hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
   if(FAILED(hr)) {
      ::MessageBox(NULL, "Excel not registered properly", "Error", 0x10010);
      return __LINE__;
   }
   // Make it visible (i.e. app.visible = 1)
   {
      VARIANT x;
      x.vt = VT_I4;
      x.lVal = 1;
      //AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
   }
   // Get Workbooks collection
   IDispatch *pXlBooks;
   {
      VARIANT result;
      VariantInit(&result);
      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
      pXlBooks = result.pdispVal;
   }
 
   std::string FileOpenName = "c:\\1.xlsx"; // путь к файлу
 
   IDispatch *pXlBook;
   {
      OLECHAR *sOleText=new OLECHAR[strlen(FileOpenName.c_str())+1];
      mbstowcs(sOleText, FileOpenName.c_str(), strlen(FileOpenName.c_str())+1);
      VARIANT result;
      VariantInit(&result);
      VARIANT fname;
      fname.vt = VT_BSTR;
      fname.bstrVal=::SysAllocString(sOleText);
      AutoWrap(DISPATCH_METHOD, &result, pXlBooks, L"Open", 1, fname);
      pXlBook = result.pdispVal;
      ::SysFreeString(fname.bstrVal);
      delete sOleText;
   }
   // Get ActiveSheet object
   IDispatch *pXlSheet;
   {
      VARIANT result;
      VariantInit(&result);
      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
      pXlSheet = result.pdispVal;
   }
   IDispatch *pXlRange = 0;
 
    //ShowMessage("cycle");
      std::string location = "a1:a2";
      VARIANT rVal;
      OLECHAR *sOleText=new OLECHAR[location.size()+1];
   mbstowcs(sOleText,location.c_str(),location.size()+1);
 
   VARIANT parm;
   parm.vt = VT_BSTR;
   parm.bstrVal = ::SysAllocString(sOleText);
 
    //IDispatch *pXlRange; // Get Range from Sheet
   {
      VARIANT result;
      VariantInit(&result);
      AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
      VariantClear(&parm);
      pXlRange = result.pdispVal;
   }
 
      AutoWrap(DISPATCH_PROPERTYGET, &rVal, pXlRange, L"Value", 0);
 
      pXlRange->Release();
      delete sOleText;
 
      SAFEARRAY* psa = rVal.parray;
      long startIndex = 0, endIndex = 0, rows = 0, cols = 0;
      SafeArrayGetLBound(psa, 1, &startIndex);
      SafeArrayGetUBound(psa, 1, &endIndex);
      rows = endIndex - startIndex + 1;
      //ShowMessage(IntToStr(rows));
 
      SafeArrayGetLBound(psa, 2, &startIndex);
      SafeArrayGetUBound(psa, 2, &endIndex);
      cols = endIndex - startIndex + 1;
      //ShowMessage(IntToStr(cols));
 
      VARIANT* pVar = 0;
      if(FAILED(SafeArrayAccessData(psa, (void **) &pVar))) throw std::runtime_error("failed 2");
      SafeArrayUnaccessData(psa);
      //ShowMessage(IntToStr(pVar->vt));
      char classBuf[1024];
      for(int i = 0; i < rows && pVar->vt != VT_EMPTY; ++i, ++pVar)
      {
            //for(int j = 1; j <= cols; ++j)
         {
            //len = ::SysStringLen(pVar->bstrVal);
            if(pVar->vt == VT_BSTR)
            {
                WideCharToMultiByte(CP_ACP, 0, pVar->bstrVal, -1, classBuf, sizeof(classBuf), 0, 0);
                puts(classBuf);
                int ratezone = pVar[rows].dblVal;
                //ShowMessage(FloatToStr((pVar+rows)->dblVal));
 
            }
            else printf("%d", pVar->vt);
        }
      }
      // Tell Excel to quit (i.e. App.Quit)
   AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);
 
   // Release references...
   //pXlRange->Release();
   pXlSheet->Release();
   pXlBooks->Release();
   pXlApp->Release();
 
   // Uninitialize COM for this thread...
   CoUninitialize();
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2015, 16:14

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Считать данные из текстового файла по условию и записать их в другой текстовый файл (файловый ввод/вывод)
Здравствуйте! Очень прошу о помощи! Суть задания - дан текстовый файл, нужно считать его и записать...

Прочитать числа из одного файла и записать их в другой
Всем привет. Нужно создать программу. Программа генерирует N-ое количество рандомных чисел в...

Данные записать в файл F1.txt, затем прочитать оттуда, обрабатывались и записывались в бинарный файл F2.bin с проверкой
Никак не получается отладить в BC++ 3.1. Как сделать в классах так, чтобы введённые данные...

Прочитать массив из файла, изменить, вывести в другой файл
Вот задание: Вот мой код: #include &quot;stdafx.h&quot; using namespace std; int main() { const...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.