Для работы с Excel в Delphi, первым делом нужно в Uses указать модуль ComObj.
procedure TForm1.Button1Click(Sender: TObject); var XL: Variant; begin XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта XL.WorkBooks.add; // Создание новой рабочей книги XL.visible := true; end; |
Как обратиться к отдельным ячейкам листа Excel в Delphi
XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Value:=’30’; //Результатом является присвоение ячейке [1,1] первого листа значения 30. Также к ячейке //текущего листа можно обратиться следующим образом: XL.Cells[1, 1]:=’30’; |
Как добавить формулу в ячейку листа Excel в Delphi
XL.WorkBooks[1].WorkSheets[1].Cells[3,3].Value := ‘=SUM(B1:B2)’; |
Форматирование текста в ячейках Excel, производится с помощью свойств Font и Interior объекта Cell:
// Цвет заливки XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Interior.Color := clYellow; // Цвет шрифта XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Color := clRed; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Name := ‘Courier’; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Size := 16; XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Bold := True; |
Работа с прямоугольными областями ячеек, с помощью объекта Range:
XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Value := ‘Blue text’; XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Font.Color := clBlue; //В результате в области A1:C5 все ячейки заполняются текстом ‘Blue text’. |
Как выделить группу (область) ячеек Excel в Delphi
XL.Range[‘A1:C10’].Select; |
Как установить объединение ячеек, перенос по словам, и горизонтальное или вертикальное выравнивание Excel в Delphi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Выделяем группу (область) ячеек XL.Range[‘A1:C10’].Select; // объединение ячеек XL.Selection.MergeCells:=True; // перенос по словам XL.Selection.WrapText:=True; // горизонтальное выравнивание XL.Selection.HorizontalAlignment:=3; //вериткальное выравнивание XL.Selection.VerticalAlignment:=1; //Возможны следующие значения: //1 — выравнивание по умолчанию, //2 — выравнивание слева, //3 — выравнивание по центру, //4 — выравнивание справа. |
Как задать границы ячеек Excel в Delphi
XL.Selection.Borders.LineStyle:=1; // значение может быть установлено от 1 до 10 |
Как выровнять столбцы Excel по ширине, в зависимости от содержания
XL.selection.Columns.AutoFit; |
Как удалить столбец Excel в Delphi
Как задать формат ячеек Excel в Delphi
XL.columns[1].NumberFormat := ‘@’; // текстовый формат XL.columns[1].NumberFormat := ‘m/d/yyyy’; // формат дата XL.columns[1].NumberFormat = ‘0.00%’ // формат процентный XL.columns[1].NumberFormat = ‘h:mm;@’// формат время |
I’m exporting data from a CxDBGrid to an Excel file.
I’m able to create the file and copy data in it, but I’m having real trouble with the column formatting. Since I’m pulling the data from a DB I’d like the spreadsheet to reflect the type: NUMBER, VARCHAR2,DATE and so on.
I visually created a macro, went to look for the VBA code, and replicated it in the Delphi project:
sheet.Columns[K+2].NumberFormat := '0,000'; //Number
sheet.Columns[K+2].NumberFormat := '@'; //Text
sheet.Columns[K+2].NumberFormat := 'm/d/yyyy'; //Date
Number formatting works ok most of the times, but the other two don’t.
When I open the generated file, the text columns show up as type «Custom» and every cell displays «-64». If I go to edit a cell, the correct value is actually there.
Date is another issue: the DB’s format is dd/mm/yyyy and if I feed it to Excel as-is, it gets all messed up. I tried setting the correct format, but then Excel doesn’t recognize it.
Any clues?
I’m also setting column width. That works flawlessly.
useruser 165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
||||
1 |
||||
06.03.2017, 14:32. Показов 6021. Ответов 18 Метки нет (Все метки)
Delphi 7. Часть кода
Как изменить формат данных передаваемых из Excel?
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
06.03.2017, 21:43 |
2 |
useruser, у ячеек (вернее, у объекта Range) есть свойство NumberFormat, которое определяет, какого формата данные записаны в ячейку. Попробуйте поменять (временно, если не хотите изменять документ) формат нужной ячейки на текстовый и потом считывать. Если не получится, то скидывайте или весь проект, или Ваш документ Excel (желательно оба).
0 |
useruser 165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
||||
07.03.2017, 10:55 [ТС] |
3 |
|||
useruser, у ячеек (вернее, у объекта Range) есть свойство NumberFormat, которое определяет, какого формата данные записаны в ячейку. Попробуйте поменять (временно, если не хотите изменять документ) формат нужной ячейки на текстовый и потом считывать. C Delphi работаю давно. перегуглил всё. Не меняет формат. Текстовый формат в столбце AV, начиная с ячейки AV8 и заканчивая AV20.
0 |
droider 4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
||||
07.03.2017, 11:38 |
4 |
|||
Не меняет формат
0 |
165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
|
07.03.2017, 12:03 [ТС] |
5 |
Ap.ActiveSheet.Range[‘AV8:AV20’].Select; //нужно выделить диапазон Ap.Selection.NumberFormat := ‘@’; И так не работает ( Вот документ если что
0 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
07.03.2017, 14:08 |
6 |
так не работает у меня работает
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
07.03.2017, 19:15 |
7 |
useruser, какой word версии? У нас работает, а у Вас одного — нет. Подозрительно
0 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
08.03.2017, 16:14 |
8 |
какой word версии? точнее Excel, но это непринципиально, если делать правильно. useruser, мануальчик
1 |
useruser 165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
||||
09.03.2017, 06:53 [ТС] |
9 |
|||
useruser, какой word версии? У нас работает, а у Вас одного — нет. Подозрительно Вот и я тоже так думаю. Excel 2007. Код
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
09.03.2017, 23:51 |
10 |
useruser, установлю ворд 2007 и отпишусь Добавлено через 1 минуту Добавлено через 14 секунд Добавлено через 18 секунд Добавлено через 2 часа 36 минут Добавлено через 27 минут
0 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
10.03.2017, 09:23 |
11 |
выкладывайте больше кода там у него явно каша. Сам диапазон тоже странноват.
0 |
useruser 165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
||||
10.03.2017, 12:23 [ТС] |
12 |
|||
никто его не украдет Да я не боюсь кражи. )) Никому это не надо и не будет надо.. Я не хочу вас грузить кодом. Написал отдельно тестовую программу. тот же результат. Вот программа, исходники и excel файл. Убедитесь сами. Вот отдельно код, если лень качать.
0 |
D1973 |
|||||
11.03.2017, 10:34
|
|||||
0 |
Джоуи 1073 / 635 / 240 Регистрация: 05.05.2015 Сообщений: 3,546 Записей в блоге: 2 |
|
11.03.2017, 10:50 |
14 |
useruser, проблема не в программе, а в документе Excel. Скопируйте содержимое проблемной ячейки в какую-нибудь свободную ячейку. Затем оттуда скопируйте обратно в исходную. Сохраните документ. Все работает прекрасно: Почему Excel так делает — спросите в разделе Excel
0 |
1177 / 419 / 106 Регистрация: 31.03.2012 Сообщений: 1,138 |
|
11.03.2017, 13:12 |
15 |
попробуй это код (использовать formula, вместо values и т.д.)
0 |
165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
|
12.03.2017, 11:40 [ТС] |
16 |
useruser, проблема не в программе, а в документе Excel. Скопируйте содержимое проблемной ячейки в какую-нибудь свободную ячейку. Затем оттуда скопируйте обратно в исходную. Сие есть извращение. )
попробуй это код (использовать formula, вместо values и т.д.) Архив битый (
0 |
Модератор 8379 / 5580 / 2275 Регистрация: 21.01.2014 Сообщений: 23,954 Записей в блоге: 3 |
|
12.03.2017, 11:45 |
17 |
Сообщение было отмечено useruser как решение Решение
Архив битый ( только что проверил — архив абсолютно нормальный.
1 |
4884 / 2756 / 849 Регистрация: 04.10.2012 Сообщений: 10,054 |
|
12.03.2017, 11:52 |
18 |
Неужели никак нормально не достать это значение в числовом виде? я Вам привел пример как, и Вы не поверите, но у меня есть проект, в котором подобное форматирование работает без проблем в любой версии ms офиса 2007-2016 (2003 давно в глаза не видел) и еще см.
проблема не в программе, а в документе Excel
1 |
165 / 89 / 38 Регистрация: 29.06.2015 Сообщений: 1,089 |
|
12.03.2017, 13:30 [ТС] |
19 |
я Вам привел пример как, и Вы не поверите, но у меня есть проект, в котором подобное форматирование работает без проблем И у меня тоже есть проекты, где это работает, а тут…не сработало. ( Вот я и написал.
только что проверил — архив абсолютно нормальный. Спасибо, этот архив нормально распаковался.
0 |
2004 г. Особенности работы с «русским» Excel’ем
|
Format code | Русский код форматирования | Описание |
&L | &Л | Выравнивает последующие символы влево. |
&C | &Ц | -«- по центру. |
&R | &П | -«- вправо. |
&E | &Й | Двойное подчеркивание (double-underline) вкл. или выкл. |
&X | &Р | Верхний индекс (superscript) вкл. или выкл. |
&Y | &И | Нижний индекс (subscript) вкл. или выкл. |
&B | &Ж | Жирный (bold) вкл. или выкл. |
&I | &Н | Наклонный (italic) вкл. или выкл. |
&U | &Ч | Подчеркнутый (underline) вкл. или выкл. |
&S | &З | Зачеркнутый (strikethrough) вкл. или выкл. |
&D | &Д | Текущая дата. |
&T | &В | Текущее время. |
&F | &Ф | Имя документа (книги). |
&A | &Я | Имя листа. |
&P | &С | Номер страницы. |
&P+number | &С+число | Номер страницы + указанное число. |
&P-number | &С-число | Номер страницы — указанное число. |
&& | && | Одиночный ampersand. |
& «fontname» | &»ИмяШрифта[,начертание]» | Печать указанным шрифтом [и начертанием] (не обязательно). Обязательно указывать в двойных кавычках. |
&nn | &nn | Печать шрифтом указанного размера. |
&N | &К | Общее количество страниц. |
И еще один опыт:
ASheet.PageSetup.CenterFooter :=
'&"Arial"&8Лист &"Arial,bold"&С&"Arial,normal"
из &"Arial,bold"&К';
Работает! Т.е. начертания (Style у класса TFont в Delphi) шрифтов можно уверенно писать по-английски. Или заменить на коды форматирования:
ASheet.PageSetup.CenterFooter :=
'&"Arial"&8Лист &Ж&С&Ж из &Ж&К';
Примечание:
для перевода строки в колонтитуле или ячейке используйте симол LF, ASCI код 10 (
#10):
ASheet.PageSetup.CenterFooter := 'Первая строка'
#10'Вторая строка'; ASheet.Range['A1', EmptyParam].Value := 'Первая строка'
#10'Вторая строка';
Выводы
При работе с русским Excel’ем из Delphi необходимо соблюдать следующие правила:
- при задании форматов использовать только русские форматы чисел и даты;
- при цветном форматировании чисел указывать цвета только на русском языке;
- при записи формул из вариантного массива использовать только русские формулы;
- при создании колонтитулов использовать только русские коды форматирования;
- для совместимости с английской версий необходимо проверять LCID интрефейса пользователя Excel’я и действовать соответственно.
Мне не удалось найти документацию, касающуюся моментов описанных выше. Весь материал построен чисто на собственном опыте. И еще: не было возможности проверить на полностью английских версиях Windows и Office.
Скачать проект: RusExcel.zip (4,6К)
Все примеры тестировались на Delphi 6, Delphi 7, на русских версиях WindowsXP + OfficeXP, Windows98SE + Office2000 SR?1.
Как програмно произвести форматирование ячеек в excel (например сделать ячейку в текстовом формате, изменить ширину столбца и т.д.)
Когда-то давно занималась этой проблемой, вот кусочек кода,
наверное можно делать и как-то по-другому, это просто как вариант
ответа на твой вопрос.
procedure TFMenu21.RadioButton5Click(Sender: TObject);
const
xlCenter=-4108;
XLWBatWorksheet=-4167;// для создания книги с одной страницей
Var
xl : OleVariant;
x,i,first : integer; // first для переименования страницы с именем «Лист1»
x1,y1 : integer; // для выделения диапазона в Excel
begin
try
// Excel уже запущен?
xl:=GetActiveOleObject(«Excel.Application»);
ShowMessage(«У Вас уже загружен Excel.Завершите его работу, а затем повторите вывод»);
xl.Application.WindowState:=-4137;
//xl.Visible:=True;
xl.Quit;
xl:=Unassigned;
Exit;
except
// Hет, еще нет…
xl:=CreateOleObject(«Excel.Application»);
end;
xl.Workbooks.Add[XLWBatWorksheet];
// xl.Visible:=True;
first:=1;
x1:=0;
Y1:=0;
For i:=3 downto 1 do begin
x:=2;
if first=0 then xl.Workbooks[1].Worksheets.Add else first:=0;
If i=1 then
begin
xl.Range[xl.Cells[x,2],xl.Cells[x+1,14]].MergeCells:=True; // объединение ячеек
xl.Range[xl.Cells[x,2],xl.Cells[x+1,14]].WrapText:=True; // перенос текста
xl.Workbooks[1].Worksheets[1].Name:=»имя страницы»;
// Вывожу какую-то шапку таблицы
x:=x+1;
xl.Range[xl.Cells[x,2],xl.Cells[x+2,2]].MergeCells:=True; // объединение ячеек
xl.Cells[x,2]:=»столбик 1″;
xl.Range[xl.Cells[x,3],xl.Cells[x+1,4]].MergeCells:=True; // объединение ячеек
xl.Cells[x,3]:=»столбик 2″;
// Вывожу данные из Ttable (DM.TsvodD1) в Excel
DM.TSvodD1.Open;
DM.TSvodD1.First;
x1:=x; // запоминаю начальную строку
While not DM.TSvodD1.Eof do
begin
xl.Workbooks[1].WorkSheets[1].Activate;
xl.ActiveWindow.DisplayZeros:=False; // не показывать нули
xl.ActiveWindow.DisplayGridlines:=False; // не показывать сетку
// жирный шрифт xl.Range[xl.Cells[x,2],xl.Cells[x,2]].Font.Bold:=True;
xl.Cells[x,2]:=DM.TSvodD1F.Value;
if DM.TSvodD1T.Value=1 then xl.Cells[x,3]:=»< 0.2″;
if DM.TSvodD1T.Value=2 then xl.Cells[x,3]:=»0.2-0.3″;
// if DM.TSvodD1T.Value=3 then xl.Cells[x,3]:=»> 0.3″;
if DM.TSvodD1T.Value=3 then xl.Cells[x,3]:=» 0.5 «;
xl.Cells[x,4]:=DM.TSvodD1M.Value;
xl.Range[xl.Cells[x,7],xl.Cells[x,7]].NumberFormat:=»@»; // установка текстового формата для ячейки
xl.Cells[x,14]:=DM.TSvodD1Proc.Value;
x:=x+1;
DM.TSvodD1.Next;
end; // while not TSvodD1.Eof
y1:=x-1; // запоминаю конечную строку
// вывожу итоги
xl.Workbooks[1].WorkSheets[1].Rows.Rows[x].RowHeight:=44.25; // высота строки
xl.Range[xl.Cells[x,2],xl.Cells[x,14]].WrapText:=True;
// Форматирую
xl.Workbooks[1].worksheets[1].Range[xl.Cells[1,2],xl.Cells[x,14]].VerticalAlignment:=2;
xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,2],xl.Cells[x,14]].HorizontalAlignment:=xlCenter; // выводить в центре ячейки
xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,2],xl.Cells[x,14]].Font.Bold:=True;
xl.Workbooks[1].worksheets[1].Range[xl.Cells[x-3,3],xl.Cells[x-3,14]].Borders.Weight := 2;
// устанавливаю ширину колонок
xl.Workbooks[1].worksheets[1].Columns.Columns[1].ColumnWidth:=2.43;
// границы ячейки
xl.Workbooks[1].worksheets[1].Range[xl.Cells[x1,2],xl.Cells[y1,2]].NumberFormat:=»0,0″;
xl.Range[xl.Cells[x1,4],xl.Cells[y1,4]].NumberFormat:=»0,0″;
xl.Visible:=True;
Можно сделать проще, запусти Excel, запусти запись макроса и делай что тебе нужно, то как ворматирование текста, установка ширины ячейки, да всё что угодно, а потом смотри что он там на генерировал в Visual Basice …..
Спасибо Татьяна, попробую.