Help! Экспорт данных из программы на C# в Excel

stm5943770

Нужен совет как побороть проблему.
Есть программа, которая считает какие-то данные. В результате имеем кучу вещественных чисел.
Пытаемся программно экспортировать данные в Excel и после экспорта Excel воспринимает вещественные числа как строки. Нужно чтобы без доп. преобразований эти чиселки потом в формулах использовались (соответственно чтобы сразу получали нужное в Excel)
Как можно это сделать ?

FRider

ты просто в .csv пишешь и неработает?

stm5943770

Делается так. Есть функция.
private void LoadValueListObject(Excel.ListObject obj, int calculationsLogID)
     {
     string id = obj.Name;
     if (!string.IsNullOrEmpty(id
     {
     BusinessLogic.BLUserFormsList lstUserForm = BusinessLogic.BLUserFormsList.GetUserFormList;
     BusinessLogic.BLUserForms form = lstUserForm.FindByID(int.Parse(id;
     if (form.UserFormTable != null)
     {
     BusinessLogic.BLCalculationsLogPropertiesList value = BusinessLogic.BLCalculationsLogPropertiesList.GetCalculationsLogPropertiesList(dtFilter.Value, calculationsLogID);
     form.LoadTableValues(value);
     for (int j = 1; j < form.UserFormTable.Columns.Count; j++)
     for (int i = 0; i < form.UserFormTable.Rows.Count; i++)
     {
     obj.Range[i + 2, j + 1] = form.UserFormTable.Rows[i][j]; ************ДОБАВЛЕНИЕ В EXCEL - НЕТ типизации для excel. он сам проводит преобразование, но для вещественных чисел не проводит
     }
    
     }
     }
     }

FRider

Вообще можно воспользоваться вот такой штукой: http://www.carlosag.net/Tools/ExcelXmlWriter/
Работает точно начиная с OfficeXP, не требует собственно екселя, а так же возни с интеропом. Там сможешь указать конкретно, какой тип поля

stm5943770

НЕ получится. Уже используются динамические Excel объекты Excel.ListObject

FRider

НЕ получится.
Что значит не получится? Нет возможности изменить код экспорта?
Уже используются динамические Excel объекты Excel.ListObject

Это всмысле через Interop? Там должно быть что-то на тему типизации ячейки,т.к. например из VB можно это сделать, хотя Interop то еще счастье.

stm5943770

Это всмысле через Interop? Там должно быть что-то на тему типизации ячейки,т.к. например из VB можно это сделать, хотя Interop то еще счастье.
Именно это интересует. Можешь дать ссылочку с инфой? Где посмотреть подробнее можно
Пока не нашли принудительной установки числового типа
>>>Что значит не получится? Нет возможности изменить код экспорта?
Переписать не вариант , т.к. уже на это заточено куча кода - а проблема замечена на самом последнем этапе :( - из-за изменений требований заказчика

FRider

надо гуглить. Можешь открыть Excel, там создать макрос и в браузере объектов поискать, где выставляется тип данных у Range, а потом попытаться сделать аналогично в шарпе.

stm5943770

надо гуглить. Можешь открыть Excel, там создать макрос и в браузере объектов поискать, где выставляется тип данных у Range, а потом попытаться сделать аналогично в шарпе.
Уже опробавано. Тока проблема в том, когда вставляется вещественное число как строка и потом переводится в число.. скрипт нечего не записывает

FRider

Тока проблема в том, когда вставляется вещественное число как строка и потом переводится в число..
утерял мысль.
form.UserFormTable.Rows[i][j] - возвращает double?

stm5943770

form.UserFormTable.Rows[i][j] - возвращает double?
Вообще object, но можно привести к double, тока от этого толку

kruzer25

В MSDN должно быть написано, что можно делать с Excel.ListObject.
Наверняка можно в него засунуть данные не только через Range[a, b] = value, а и как-нибудь через SetValue(a, b, value, ValueSetParams.Type_Double).

stm5943770

В MSDN должно быть написано, что можно делать с Excel.ListObject.
Наверняка можно в него засунуть данные не только через Range[a, b] = value, а и как-нибудь через SetValue(a, b, value, ValueSetParams.Type_Double).
Эх... ну это понятно.. буду дальше рыть

stm5943770

А вообще.. если абстрагироваться... то через Excel`кий объект Range можно добавить в Excel типизированные данные?

Andbar

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

stm5943770

Тред читал по диагонали. Здесь уже писали, что перед вставкой данных в экзель следует задать форматы ячеек?
Вообще как я поняла. если ты имешь ввиду формат вывода, то это не катит, а вот если ты имешь формат самих данных, то это оно... тока не понятно как... вот например в строку можно все перевести так:
Excel.Range)obj.Range[i + 2, j + 1]).NumberFormat = "@";
а вот как указать чтоб была токо число...

Andbar

а вот как указать чтоб была токо число...
Запусти экзель, нажми ^1 и выбери в списке форматов "(все форматы)". Ещё рекомендую почитать информацию о работе с экзелем на сайте "Королевско Дельфи". Всё-таки у Delphi-программистов накопилось гораздо больше опыта в решении подобных задач, а на уровне COM-интерфейса подобные проблемы не зависят от языка, если не считать специфики работы с самим COM-ом.

Mixaz

obj.Range[i + 2, j + 1] =

я не профессор C# конечно :)
но в Excel есть разница написать Cells(i,j)=A или Cells(i,j).Value =A
думаю должно быть что-то типа:
 
obj.Range[i + 2, j + 1].Value = Dbl(form.UserFormTable.Rows[i][j]);

stm5943770

я не профессор C# конечно
но в Excel есть разница написать Cells(i,j)=A или Cells(i,j).Value =A
думаю должно быть что-то типа:

В ответ на:
obj.Range[i + 2, j + 1].Value = Dbl(form.UserFormTable.Rows[i][j]);
к сожалению этот вариант также не подошел - уже пробовали :(
также пробовали obj.Range[i + 2, j + 1].Value2
В конечном итоге договорились с заказчиком - что будет править пользователь уже в Excel с помощью внутренней функции ЗНАЧЕН (ссылка на ячейку) - возвращает из текста число :D

stm7583298

Excel.Range)obj.Range[i + 2, j + 1]).NumberFormat = "@";а вот как указать чтоб была токо число...
Excel.Range)obj.Range[i + 2, j + 1]).NumberFormat = "0.00";
легко смотрится записью макроса

klyv

ну ведь уже на грани решения задачи - и сразу в кусты...
NumberFormat - верное решение, мы его же использовали для дат и для требуемого отображения сумм.
Оставить комментарий
Имя или ник:
Комментарий: