Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
1

Чтение и сохранение информации из .xls (Excel)

08.11.2011, 01:17. Просмотров 6554. Ответов 12
Метки нет (Все метки)

Всем еще раз привет) у кого есть какие идеи, как при помощи OLE открыть файлик, оценить размерность матрицы, и радостно записать ее в обычный int массив (ну при условии что в ячейках числа). Как открыть файлик я знаю, а вот как посчитать столбцы/строки и считать нужный диапазон в память?




буду безумно признателен, если кто поможет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 01:17
Ответы с готовыми решениями:

Чтение xls/xml.
У меня есть файл xls 30000 записей. Читаю литературу везде написано, что...

OpenOffice чтение документа xls
В данной теме мне помогли с файлом DOC(X)...

Сохранение вывода информации
Доброго времени суток. Вот немного меня поджала курсовая работа. При создании...

Чтение и сохранение файла
Почти закончила лабораторную...и закосячила с функциями для работы с...

Сохранение и чтение из StringGrid
Есть следующий код: struct { AnsiString Familia; int NumGroup; int ...

12
nikitapel
36 / 36 / 6
Регистрация: 20.03.2011
Сообщений: 331
08.11.2011, 15:42 2
Юзай google .В интернете очень много информации об этом!
Если очень надо помогу!!!

 Комментарий модератора 
nikitapel, Правила
п.4.2. Не отсылайте других пользователей в поиск и избегайте ссылок на поисковые системы (Google, Yandex и др.). Самостоятельно найдите ответ на вопрос и разместите его на форуме.
Лучше, действительно, помогите - и не словом, а делом.
0
LK
Заблокирован
08.11.2011, 16:57 3
prootq, посмотрите для начала здесь: Работа с OLE-сервером Excel
2
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
08.11.2011, 20:27  [ТС] 4
LK, да я читал ту статью - мануал. Да, приятно и полезно, но того о чем я там спрашиваю там нет.

Добавлено через 4 минуты
еще раз уточняю, я хочу чтобы со мной поделились идеями алгоритма или алгоритмом подсчета строк/столбцов матрицы в открытом файле, и алгоритмом чтения ячеек в память (циклом, я имею ввиду обычный массив типа int[][] ). Или же диапазон как то весь загонять сразу если это возможно..
0
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
10.11.2011, 03:19  [ТС] 5
nikitapel, очень надо, помогите пожалуйста, а не то подведу много - много людей =(
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
10.11.2011, 15:50 6
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
        // запуск Excel и открытие таблицы
        Variant MyExcel = CreateOleObject("Excel.Application");
        MyExcel.OlePropertyGet("WorkBooks").OleProcedure("Open", "C:\\1.xls");
 
        // получение параметров таблицы: кол-во строк, столбцов
        int iFirstRow = MyExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Row");
        int iFirstCol = MyExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Column");
        int iRowsCount = MyExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
        int iColsCount = MyExcel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
 
        // вывод параметров таблицы в Memo
        Memo1->Lines->Add("iFirstRow = " + String(iFirstRow));
        Memo1->Lines->Add("iFirstCol = " + String(iFirstCol));
        Memo1->Lines->Add("iRowsCount = " + String(iRowsCount));
        Memo1->Lines->Add("iColsCount = " + String(iColsCount));
 
        // задаю параметры для StringGrid
        StringGrid1->FixedCols = 0;
        StringGrid1->FixedRows = 0;
        StringGrid1->RowCount = iRowsCount;
        StringGrid1->ColCount = iColsCount;
 
        // заполнение StringGrid значениями из Excel-таблицы
        Variant vCells = MyExcel.OlePropertyGet("Cells");
 
        for ( int i = iFirstRow; i < iFirstRow+iRowsCount; i++ )
        {
                for ( int j = iFirstCol; j < iFirstCol+iColsCount; j++ )
                {
                        int iValue = vCells.OlePropertyGet("Item", i, j);
                        StringGrid1->Cells[j-iFirstCol][i-iFirstRow] = iValue;
                }
        }
 
        MyExcel.OleProcedure("Quit"); // закрытие Excel
1
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
10.11.2011, 18:26  [ТС] 7
kzru, я тебя люблю = DDD

посчитать все получилось, теперь буду пробовать загонять в память))

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  int ExServer::UsedRowCount(AnsiString &SheetName)
  {
 
int iFirstRow = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Row");
int iFirstCol = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Column");
int iRowsCount = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
 
return iRowsCount;
 
}
 
 
int ExServer::UsedColumnCount(AnsiString &SheetName)
  {
 
int iFirstRow = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Row");
int iFirstCol = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Column");
int iColsCount = var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
return iColsCount;
 
  }
Добавлено через 1 минуту
смущают только ворнинги компилятора

[BCC32 Warning] ExServer.cpp(311): W8004 'iFirstCol' is assigned a value that is never used
Full parser context
ExServer.cpp(303): parsing: int ExServer::UsedRowCount(AnsiString &)
[BCC32 Warning] ExServer.cpp(311): W8004 'iFirstRow' is assigned a value that is never used
Full parser context
ExServer.cpp(303): parsing: int ExServer::UsedRowCount(AnsiString &)
[BCC32 Warning] ExServer.cpp(322): W8004 'iFirstCol' is assigned a value that is never used
Full parser context
ExServer.cpp(315): parsing: int ExServer::UsedColumnCount(AnsiString &)
[BCC32 Warning] ExServer.cpp(322): W8004 'iFirstRow' is assigned a value that is never used
Full parser context
ExServer.cpp(315): parsing: int ExServer::UsedColumnCount(AnsiString &)
0
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
10.11.2011, 19:30 8
предуждения сообщают, что указанные и объявленные в данной функции переменные нигде внутри неё не используются.
код, который выше, можно укоротить до такого:
C++
1
2
3
4
5
6
7
8
9
int ExServer::UsedRowCount(AnsiString &SheetName)
{
        return var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");
}
 
int ExServer::UsedColumnCount(AnsiString &SheetName)
{
        return var_Excel.OlePropertyGet("ActiveSheet").OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
}
0
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
10.11.2011, 19:41  [ТС] 9
дык понятно, но ведь должны же использоваться =)
0
LK
Заблокирован
11.11.2011, 01:05 10
напишите использование - и будут использоваться, имхо
0
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
11.11.2011, 01:30  [ТС] 11
да, LK, я там протупил немного, действительно. Вопрос решен:


C++
1
2
int** hurma;
hurma = MyExServer->CreateMаtrix(RawCount, CalumnCount);
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
int** ExServer::CreateMаtrix (int RawCount,int CalumnCount)
{
 
 
    table_0 = (int**)malloc(RawCount*sizeof(int*));
 
    for(int i = 0; i<RawCount; i++)
    {
        *(table_0 + i) = (int*)malloc(CalumnCount*sizeof(int));
    }
 
 
 Variant vCells = var_Excel.OlePropertyGet("Cells");
 
/////////////////////////////////////////////
 for ( int i = 0; i < RawCount; i++ )
        {
                for ( int j = 0; j < CalumnCount; j++ )
                {
                        int iValue = vCells.OlePropertyGet("Item", i+1, j+1);
                         *(*(table_0+i)+j)= iValue ;
                }
        }
 
 
     return table_0;
 
 
}
1
kzru_hunter
1108 / 777 / 99
Регистрация: 01.02.2011
Сообщений: 1,779
Записей в блоге: 1
11.11.2011, 05:27 12
А куда дел iFirstRow, iFirstCol? Они нужны, если таблица будет располагаться не с самой левой верхней ячейки, а правее или ниже. Хотя видимо в вашем случае это исключено.
0
prootq
8 / 8 / 2
Регистрация: 09.06.2011
Сообщений: 72
12.11.2011, 02:42  [ТС] 13
kzru, а они почему то всегда получатся равными единице, поэтому пришлось отказаться от их использования, так что пользователей я буду заставлять распологать таблицу с левого верхнего угла =((

сейчас просто нет времени копаться почему это так, проблем хватает и без этого >_<
0
12.11.2011, 02:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2011, 02:42

Сохранение/чтение StringGrid
Приведите пожалуйста примеры сохранения и чтения из файла StringGrid'а,...

Чтение и сохранение в файл
Добрый день! Помогите делаю прогу, к-я по входным параметрам a,b,c вычисляет...

Чтение и сохранение *.txt
Всем привет! Есть txt, в нем: filemask=File.dat; struct mainFile {...


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

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

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