![]() |
|
Работа из 1с7.7 с екселем | ☑ | ||
---|---|---|---|---|
0
деморализующий
08.12.05
✎
10:35
|
Здрасти,как при работе с книгой ексель поменять тип ячейки?спасибо
|
|||
1
аморал
08.12.05
✎
10:36
|
т.е. задать тип данных в ячейке?
|
|||
2
Salvador Limones
08.12.05
✎
10:38
|
(0) Какой нафиг тип?
|
|||
3
аморал
08.12.05
✎
10:40
|
нужно явно из 1с через ком объект указать что здесь будет Дата
|
|||
4
аморал
08.12.05
✎
10:40
|
в конкретной ячейке,
|
|||
5
аморал
08.12.05
✎
11:04
|
как в визуал бейсике тип данных ячейки задать?
|
|||
6
Лошадка в пальто
08.12.05
✎
11:06
|
где-то так:
Перем ВыббФ, ВыббК; Перем Форм; // переменная для определения форматирования Перем ВыбКат,ВыбФ; Перем Нач[8],Кон[8],СпВыр[8]; Перем СпРазделителей; Перем СистемныйРазделитель; // конвертер из MXL в XLS!! //***************************************** Функция АдресСправа(Р,К) Возврат "R"+Строка(Р)+"C"+Строка(К+1); КонецФункции //АдресСправа //***************************************** Функция АдресСнизу(Р,К) Возврат "R"+Строка(Р+1)+"C"+Строка(К); КонецФункции //АдресСнизу //*************************************************** Функция ЭтоЦифра(сим) Экспорт Циф=?(строка(Число(сим))=сим,1,0); Возврат Циф; КонецФункции //ЭтоЦифра //***************************************** Функция ТипЗн(Зн) Форм=""; // по значению в 1С, возможно форматированному - восстановить его нормальное осмысленное значение Если СтрЧислоВхождений(Зн,".")=2 Тогда //возможно, это дата чч.мм.гггг или чч.мм.гг Знн=СокрЛП(Зн); Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли; КонецЕсли; //еще бы хорошо было правильно трактовать даты с косой чертой и с тире Если СтрЧислоВхождений(Зн,"/")=2 Тогда //возможно, это дата чч/мм/гггг или чч/мм/гг Знн=СокрЛП(СтрЗаменить(Зн,"/",".")); Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли; КонецЕсли; Если СтрЧислоВхождений(Зн,"-")=2 Тогда //возможно, это дата чч-мм-гггг или чч-мм-гг Знн=СокрЛП(СтрЗаменить(Зн,"-",".")); Если ПустоеЗначение(Дата(Знн))=0 Тогда Форм=?(СтрДлина(Знн)=10,"ДД.ММ.ГГГГ","ДД.ММ.ГГ"); Возврат Дата(Знн) КонецЕсли; КонецЕсли; Знн=СокрЛП(Зн); Если Знн="" Тогда Форм=""; Возврат ""; КонецЕсли; // подавление нулевых значений пробелом становится пустым значением Если Знн="-" Тогда Форм=""; Возврат ""; КонецЕсли; // подавление нулевых значений знаком - становится пустым значением Для сч=1 по СтрДлина(Знн) Цикл Сим=Сред(Знн,сч,1); Если (ЭтоЦифра(Сим)=0) и (СпРазделителей.НайтиЗначение(Сим)=0) и (Сим<>"-") Тогда Форм=""; Возврат Зн; // это уже не число и не дата, а не пойми что КонецЕсли; КонецЦикла; КолРазд=0; Для счРазд=1 по СпРазделителей.РазмерСписка() Цикл ЗнРазд=СпРазделителей.ПолучитьЗначение(СчРазд); Если Найти(Знн,ЗнРазд)>0 Тогда КолРазд=КолРазд+1; КонецЕсли; КонецЦикла; //если нашли все больше двух разделителей - то это тоже не число а не пойми что Если КолРазд>2 Тогда Форм=""; Возврат Зн; КонецЕсли; РР1=""; РР2=""; Для счРазд=1 по СпРазделителей.размерСписка() Цикл ЗнРазд=СпРазделителей.ПолучитьЗначение(СчРазд); Если Найти(Знн,ЗнРазд)>0 Тогда Если РР1="" Тогда РР1=ЗнРазд Иначе РР2=ЗнРазд КонецЕсли; КонецЕсли; КонецЦикла; Если (РР1="") и (РР2="") Тогда Форм=""; Знн=СокрЛП(Зн); Для сч=1 по СтрДлина(Знн) Цикл Форм=Форм+"0" КонецЦикла; Возврат СокрЛП(Зн) // это просто число без никаких излишеств форматирования, уберем возможные пробелы ИначеЕсли РР2="" Тогда // это какие-то цифры с разделителями одного вида СпВхождений=СоздатьОбъект("СписокЗначений"); Для сч=-СтрДлина(Знн) по -1 Цикл Сим=Сред(Знн,-Сч,1); Если Сим=РР1 Тогда СпВхождений.ДобавитьЗначение(-сч) КонецЕсли; КонецЦикла; Десятичный=0; Поз=СпВхождений.ПолучитьЗначение(1); Если (Поз=СтрДлина(Знн)-3) и (Спвхождений.РазмерСписка()=1) Тогда Если (РР1=".") или (РР1=",") Тогда Знн=Лев(Знн,Поз-1)+"*"+Прав(Знн,СтрДлина(Знн)-Поз); Десятичный=1; КонецЕсли; ИначеЕсли (Спвхождений.РазмерСписка()=1) Тогда Знн=Лев(Знн,Поз-1)+"*"+Прав(Знн,СтрДлина(Знн)-Поз); Десятичный=1; КонецЕсли; Для сч=2 По Спвхождений.РазмерСписка() Цикл Зн1=СпВхождений.ПолучитьЗначение(сч-1); Зн2=СпВхождений.ПолучитьЗначение(сч); Если (Зн2+4<>Зн1) Тогда Форм=""; Возврат Зн; // это ненормальное расположение разделителей КонецЕсли; КонецЦикла; Знн=СтрЗаменить(Знн,РР1,""); Если Найти(Знн,"*")<>0 Тогда Тч=Макс(СтрДлина(Знн)-Найти(Знн,"*"),1); Иначе Тч=0; КонецЕсли; Знн=СтрЗаменить(Знн,"*","."); Форм=?(Десятичный=1,"0","# ##0"); Форм=?(Тч>0,Форм+",",Форм); Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла; Возврат Знн// и еще как-то просигналить что с разделителями Иначе // присутствуют разделители обоих видов - один из них возможно десятичный, а второй - триадный Если (СтрЧислоВхождений(Знн,РР1)>1) и (СтрЧислоВхождений(Знн,РР2)>1) Тогда // разделители вперемешку Форм=""; Возврат Зн; КонецЕсли; СпВхождений =СоздатьОбъект("СписокЗначений"); СпВхождений1=СоздатьОбъект("СписокЗначений"); Для Сч=-стрДлина(Знн) по -1 Цикл Сим=Сред(Знн,-Сч,1); Если Сим=РР1 Тогда СпВхождений.ДобавитьЗначение(-сч) КонецЕсли; Если Сим=РР2 Тогда СпВхождений1.ДобавитьЗначение(-сч) КонецЕсли; КонецЦикла; Поз1=СпВхождений.ПолучитьЗначение(1); Поз2=СпВхождений1.ПолучитьЗначение(1); Если Поз1<Поз2 Тогда //2-й это десятичный 1-й триадный Если СпВхождений1.РазмерСписка()>1 Тогда Форм=""; Возврат Зн; КонецЕсли; Если Поз1<>Поз2-4 Тогда Форм=""; Возврат Зн; КонецЕсли; // ненормальное отделение первой триады Для сч=2 по СпВхождений1.РазмерСписка() цикл Зн1=СпВхождений1.ПолучитьЗначение(сч-1); Зн2=СпВхождений1.ПолучитьЗначение(сч); Если (Зн2+4<>Зн1) Тогда Форм=""; Возврат Зн; // это ненормальное расположение разделителей КонецЕсли; КонецЦикла; Знн=СтрЗаменить(Знн,РР1,""); Знн=СтрЗаменить(Знн,РР2,"."); Тч=Макс(1,СтрДлина(Знн)-Найти(Знн,".")); Форм="# ##0"; Форм=?(Тч>0,Форм+",",Форм); Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла; Возврат Знн; // и просигналить про разделитель Иначе //1-й десятичный 2-й триадный Если СпВхождений.РазмерСписка()>1 Тогда Форм=""; Возврат Зн; КонецЕсли; Если Поз2<>Поз1-4 Тогда Форм=""; Возврат Зн; КонецЕсли; // ненормальное отделение первой триады Для сч=2 по СпВхождений.РазмерСписка() цикл Зн1=СпВхождений.ПолучитьЗначение(сч-1); Зн2=СпВхождений.ПолучитьЗначение(сч); Если (Зн2+4<>Зн1) Тогда Форм=""; Возврат Зн; // это ненормальное расположение разделителей КонецЕсли; КонецЦикла; Знн=СтрЗаменить(Знн,РР2,""); Знн=СтрЗаменить(Знн,РР1,"."); Тч=Макс(1,СтрДлина(Знн)-Найти(Знн,".")); Форм="# ##0"; Форм=?(Тч>0,Форм+".",Форм); Для сч=1 по Тч цикл Форм=Форм+"0" КонецЦикла; Возврат Знн; // и просигналить про разделитель КонецЕсли; КонецЕсли; КонецФункции //ТипЗн() //*************************************************** Функция БукваПоНомеру(ном) КодА=КодСимв("A"); КодБуквы=КодА+Ном-1; Буква=Симв(КодБуквы); возврат Буква; КонецФункции //БукваПоНомеру(ном) //********************************************************* Функция НазваниеСтолбца(Ном) // возвращает название столбца в Excel Если Ном=0 Тогда Ном=26 КонецЕсли; Если Ном<=26 Тогда Назв=БукваПоНомеру(Ном) Иначе Ост=Ном-Цел((Ном-1)/26)*26; Част=Цел((Ном-1)/26); Назв=НазваниеСтолбца(Част)+НазваниеСтолбца(Ост) КонецЕсли; Возврат Назв КонецФункции //НазваниеСтолбца(Ном) //******************************************* Процедура ЗаписатьЕксель(Таблица,ВыбКат,ВыбФ,ИмяЛиста="Лист1"); ОкноЕхс=СоздатьОбъект("Excel.Application"); НовыеРабочиеКниги=ОкноЕхс.Workbooks; Если Прав(ВыбКат,1)<>"\" Тогда ВыбКат=ВыбКат+"\"; КонецЕсли; ИмяФФ =ВыбКат+ВыбФ; ОкноЕхс.Visible=0; ОкноЕхс.DisplayAlerts=0; Попытка // если уже открыт файл с таким именем, то просто неназойливо сохраним его и закроем :-) // "не стой под стрелой!!!" ОкноЕхс.Windows(ВыбФ).Close(1); // или Close(-1) - тогда просто молча закроем, не сохраняя Исключение КонецПопытки; ОкноЕхс.DisplayAlerts=1; Таблица.Записать(ИмяФФ,1); Попытка РабочаяКнига=ОкноЕхс.Workbooks.Open(ИмяФФ); Исключение Предупреждение("Файл не найден "+РазделительСтрок+ИмяФФ); Возврат; КонецПопытки; ОкноЕхс.DisplayAlerts=0; ОкноЕхс.Workbooks(ВыбФ).SaveAs(ИмяФФ,-4143); //без лишних вопросов сохраним в нормальном формате Excel ОкноЕхс.DisplayAlerts=1; ОкноЕхс.Windows(ВыбФ).Visible=0; //спрячем окошко от потусторонних вмешательств ОкноЕхс.Windows(ВыбФ).DisplayWorkbookTabs = 1; //режим "показывать ярлычки листов" ОкноЕхс.Windows(ВыбФ).TabRatio = 0.2; //подвинем линеечку с ярлычками, дабы пользователи не пужались! Попытка ОкноЕхс.Workbooks(ВыбФ).Sheets(1).Name = ИмяЛиста //установим переданное имя листа Исключение ОкноЕхс.Workbooks(ВыбФ).Sheets(1).Name = "Лист1" КонецПопытки; Рядов=Таблица.ВысотаТаблицы(); Колонок=Таблица.ШиринаТаблицы(); ТЗ=СоздатьОбъект("ТаблицаЗначений"); ТЗ.КоличествоКолонок(Колонок); ТЗ.КоличествоСтрок(Рядов); Для сч=1 по Рядов Цикл Состояние("Форматирование строк ~ "+Строка(сч)); Высота=Таблица.Область("R"+Строка(Сч)+"C"+строка(Колонок+1)).ВысотаСтроки(); Если Высота=0 Тогда ОкноЕхс.Windows(ВыбФ).Activate(); Ячейка=ОкноЕхс.Cells(Сч,Колонок+1); Ячейка.Rows.AutoFit(); КонецЕсли; КонецЦикла; //установка объединений ячеек, объединенных в MXL СпУчтенных=СоздатьОбъект("СписокЗначений"); СпДиапазонов=СоздатьОбъект("СписокЗначений"); // поиск нестандартных для Excel выравниваний по выделенным столбцам Для счГ=1 по 8 Цикл Нач[счГ]=""; Кон[счГ]=""; СпВыр[счГ]=СоздатьОбъект("СписокЗначений"); КонецЦикла; ГорСт=""; СпСоотвГор=СоздатьОбъект("СписокЗначений"); // релизо-независимый обход недокументированной особенности - горизонтальные положения при установке // и при чтении - различаются!!! ТТест=СоздатьОбъект("Таблица"); ТТест.ИсходнаяТаблица("Тест"); ОблТест=ТТест.Область("R1C1"); Для сч=1 по 8 Цикл ОблТест.ГоризонтальноеПоложение(сч); Зн=ОблТест.ГоризонтальноеПоложение(); СпСоотвГор.ДобавитьЗначение(Зн); КонецЦикла; Для счРядов=1 по Рядов Цикл Состояние("Форматирование выравниваний по выделениям ~ "+Строка(счРядов)); Начч=""; Конн=""; Для счКолонок=1 по Колонок Цикл Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок); Обл=Таблица.Область(Адр); ТЗ.УстановитьЗначение(СчРядов,СчКолонок,Обл.Текст); Гор=Обл.ГоризонтальноеПоложение(); Гор=СпСоотвГор.НайтиЗначение(Гор); Если (Гор<>ГорСт) Тогда // сменилось горизонтальное положение Если (ГорСт=5) или (ГорСт=6) или (ГорСт=8) Тогда //закончился кусочек нестандартного выравнивания Начч=Нач[ГорСт]; Если Начч="" Тогда Начч=1 КонецЕсли; Конн=СчКолонок-1; Если Конн<>0 Тогда Диап=НазваниеСтолбца(Начч)+Строка(СчРядов)+":"+НазваниеСтолбца(Конн)+Строка(СчРядов); СпВыр[ГорСт].ДобавитьЗначение(СчРядов,Диап); Нач[ГорСт]=""; Кон[ГорСт]=""; КонецЕсли; КонецЕсли; Если (Гор=5) или (Гор=6) или (Гор=8) Тогда //начался кусочек нестандартного выравнивания Нач[Гор]=СчКолонок; Кон[Гор]=СчКолонок; КонецЕсли; Иначе // горизонтальное положение осталось прежним // если оно нестандартное - то обрабатываем спец. образом Если (Гор=5) или (Гор=6) или (Гор=8) Тогда Кон[Гор]=СчКолонок; Если (СчКолонок=Колонок) Тогда Начч=Нач[Гор]; Если Начч="" Тогда Начч=1 КонецЕсли; Конн=СчКолонок; Диап=НазваниеСтолбца(Начч)+Строка(СчРядов)+":"+НазваниеСтолбца(Конн)+Строка(СчРядов); СпВыр[Гор].ДобавитьЗначение(СчРядов,Диап); Нач[Гор]=""; Кон[Гор]=""; КонецЕсли; КонецЕсли; КонецЕсли; ГорСт=Гор; КонецЦикла; КонецЦикла; // в результате получили в списках-элементах массива диапазоны выравниваний по выделенным столбцам Для счКолонок=1 по Колонок Цикл Для счРядов=1 по Рядов Цикл ПроцВыполнения=Окр((СчРядов+Рядов*(СчКолонок-1))/(Колонок*Рядов)*100,2,0); Состояние("Расчет объединений ~ готовность "+Строка(ПроцВыполнения)+" %"); Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок); Текст1=ТЗ.ПолучитьЗначение(СчРядов,СчКолонок); Попытка Текст2=ТЗ.ПолучитьЗначение(СчРядов+1,СчКолонок); Исключение Текст2=Текст1 КонецПопытки; Попытка Текст3=ТЗ.ПолучитьЗначение(СчРядов,СчКолонок+1); Исключение Текст3=Текст1 КонецПопытки; Если (Текст1<>Текст2) и (Текст1<>Текст3) Тогда Продолжить КонецЕсли; Если СпУчтенных.НайтиЗначение(Адр)<>0 Тогда Продолжить КонецЕсли; // поиск объединения вправо Старт=СчКолонок; Обл=Таблица.Область(Адр); СтТекст=Обл.Текст; Обл.Текст=СтТекст+" "; Нашли=0; Пока Нашли=0 Цикл Облл=Таблица.Область(АдресСправа(СчРядов,Старт)); Попытка ТекстСт=ТЗ.ПолучитьЗначение(СчРядов,Старт+1); Исключение Нашли=1;ТекстСт=ТЗ.ПолучитьЗначение(СчРядов,Старт); КонецПопытки; ТекстНов=Облл.Текст; Если ТекстСт<>ТекстНов Тогда //эта ячейка - объединенная с выбранной Старт=Старт+1; Иначе Нашли=1; // нашли конец объединения КонецЕсли; КонецЦикла; Старт=мин(Старт,Колонок); КонецСправа=Старт; //поиск объединения вниз Старт=СчРядов; Нашли=0; Пока Нашли=0 Цикл Адрр=АдресСнизу(Старт,СчКолонок); Облл=Таблица.Область(Адрр); Попытка ТекстСт=ТЗ.ПолучитьЗначение(Старт+1,СчКолонок); Исключение Нашли=1; ТекстСт=ТЗ.ПолучитьЗначение(Старт,СчКолонок);КонецПопытки; ТекстНов=Облл.Текст; Если ТекстСт<>ТекстНов Тогда //эта ячейка - объединенная с выбранной Старт=Старт+1; Иначе Нашли=1; // нашли конец объединения КонецЕсли; КонецЦикла; Старт=мин(Старт,Рядов); КонецСнизу=Старт; Обл.Текст=СтТекст; Если (КонецСправа<>СчКолонок) или (КонецСнизу<>СчРядов) Тогда //это было объединение ячеек Диапп="R"+Строка(СчРядов)+"C"+Строка(СчКолонок)+":R"+Строка(КонецСнизу)+"C"+Строка(КонецСправа); Диап=НазваниеСтолбца(СчКолонок)+Строка(СчРядов)+":"+НазваниеСтолбца(КонецСправа)+Строка(КонецСнизу); СпДиапазонов.ДобавитьЗначение(Диапп,Диап); Если КонецСнизу=счРядов Тогда Обл=Таблица.Область("R"+Строка(СчРядов)+"C"+Строка(СчКолонок)); Гор=Обл.ГоризонтальноеПоложение(); Гор=СпСоотвГор.НайтиЗначение(Гор); СпВыр[Гор].ДобавитьЗначение(СчРядов,Диап); КонецЕсли; Для сччКолонок=СчКолонок по КонецСправа Цикл Для сччРядов=СчРядов по КонецСнизу Цикл Если (СччКолонок=СчКолонок) и (сччРядов=СчРядов) Тогда Продолжить КонецЕсли; СпУчтенных.ДобавитьЗначение("R"+Строка(сччРядов)+"C"+Строка(СччКолонок)); КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; КонецЦикла; Левое=СпСоотвГор.ПолучитьЗначение(1); //левое горизонтальное положение // установка форматированных значений ячеек Для счКолонок=1 по Колонок Цикл Для счРядов=1 по Рядов Цикл ПроцВыполнения=Окр((СчРядов+Рядов*(СчКолонок-1))/(Колонок*Рядов)*100,2,0); Состояние("Форматирование значений в ячейках ~ готовность "+Строка(ПроцВыполнения)+" %"); Адр="R"+Строка(СчРядов)+"C"+Строка(СчКолонок); Если СпУчтенных.НайтиЗначение(Адр)>0 Тогда Продолжить КонецЕсли; // из уважения к стандартным отчетам 1С :-) // иначе коды счетов с субсчетами преобразуются в числа с разделителями :-( Ячейка1С=Таблица.Область(Адр); Зн1С=СтрЗаменить(ТЗ.ПолучитьЗначение(СчРядов,СчКолонок),РазделительСтрок,Симв(10)); Зн1С=СтрЗаменить(Зн1С,Симв(13),Симв(10)); Если (Ячейка1С.ГоризонтальноеПоложение()=Левое) и (СтрДлина(Зн1С)<=255) Тогда Продолжить КонецЕсли; Форм=""; Зн=ТипЗн(Зн1С); // определили формат и нормальное значение Если (Зн=Зн1С) и (СтрДлина(Зн)<=255) Тогда Продолжить КонецЕсли; ОкноЕхс.Windows(ВыбФ).Activate(); Ячейка=ОкноЕхс.Cells(СчРядов,СчКолонок); Попытка Ячейка.NumberFormat=Форм; Исключение КонецПопытки; Ячейка.Value=Зн; КонецЦикла; КонецЦикла; // Установка объединений в Excel ВсегоОбъединений=0; Для сч=1 по 8 Цикл ВсегоОбъединений=ВсегоОбъединений+СпВыр[Сч].РазмерСписка(); КонецЦикла; ВсегоОбъединений=Макс(ВсегоОбъединений,1); Установлено=0; Для ВидВыр=1 по 8 Цикл //Если ВидВыр=7 Тогда // это по центру выделения, 1С с этим вроде бы справляется нормально // Продолжить //КонецЕсли; Для Сч=1 по СпВыр[ВидВыр].РазмерСписка() Цикл Установлено=Установлено+1; ПроцВыполнения=Окр(Установлено/ВсегоОбъединений*100,2,0); Состояние("Формирование выравниваний по выделенным столбцам ~ готовность "+Строка(ПроцВыполнения)+" %"); Диапп=""; Зн=СпВыр[ВидВыр].ПолучитьЗначение(сч,Диапп); Выс1с=Таблица.Область("R"+Строка(Зн)+"C1").ВысотаСтроки(); ОкноЕхс.Windows(ВыбФ).Activate(); ОкноЕхс.Range(Диапп).Select(); ВысЕксельСт=Число(ОкноЕхс.Selection.RowHeight()); ОкноЕхс.Selection.MergeCells=0; ОкноЕхс.Selection.EntireColumn.Hidden=0; ОкноЕхс.Selection.HorizontalAlignment=7; Если Выс1с=0 Тогда ОкноЕхс.Selection.Rows.AutoFit(); ВысЕксель=ОкноЕхс.Selection.RowHeight(); Иначе ВысЕксель=Выс1с; КонецЕсли; ВысЕксель=Макс(ВысЕксельСт,ВысЕксель); ОкноЕхс.DisplayAlerts=0; ОкноЕхс.Selection.MergeCells=1; ОкноЕхс.DisplayAlerts=1; Если видВыр%4=1 Тогда //установить по левому краю ОкноЕхс.Selection.HorizontalAlignment=1 ИначеЕсли видВыр%4=2 Тогда // установить по правому краю ОкноЕхс.Selection.HorizontalAlignment=-4152 ИначеЕсли видВыр%4=0 Тогда //установить по ширине ОкноЕхс.Selection.HorizontalAlignment=-4130 КонецЕсли; ОкноЕхс.Selection.RowHeight=ВысЕксель; //вернуть рассчитанную высоту!!! КонецЦикла; КонецЦикла; ВсегоДиапазонов=СпДиапазонов.РазмерСписка(); Для сч=1 по ВсегоДиапазонов Цикл ПроцВыполнения=Окр(Сч/ВсегоДиапазонов*100,2,0); Состояние("Формирование выравниваний по выделенным столбцам ~ готовность "+Строка(ПроцВыполнения)+" %"); Диапп=""; Диап=СпДиапазонов.ПолучитьЗначение(сч,Диапп); ОкноЕхс.Windows(ВыбФ).Activate(); ОкноЕхс.Range(Диапп).Select(); DIAP=ОкноЕхс.Selection; ОкноЕхс.DisplayAlerts=0; DIAP.MergeCells=1; ОкноЕхс.DisplayAlerts=1; DIAP.EntireColumn.Hidden=0; DIAP.EntireRow.Hidden=0; КонецЦикла; Состояние("Удаление управляющих объектов 1C...."); Удалено=0; Кол=ОкноЕхс.Workbooks(ВыбФ).ActiveSheet.Shapes.Count(); Если Кол<>0 Тогда Для сч=-кол по -1 Цикл ОкноЕхс.Workbooks(ВыбФ).ActiveSheet.Shapes(-сч).Select(); Если Найти(ОкноЕхс.Selection.Name,"Текст")<>1 Тогда Продолжить КонецЕсли; //иначе печально вылетает на картинках с ошибкой "In batsh start nesteed error" !!! //после прерывания обработки по Esc 1C висит намертво с зависшей строкой состояния Назв=ВРег(СокрЛП(ОкноЕхс.Selection.Characters.Text())); Если (Назв="НАСТРОЙКА") или (Назв="ОБНОВИТЬ") или (Назв="В EXCEL") Тогда ОкноЕхс.Selection.Delete(); Удалено=Удалено+1; КонецЕсли; Если Удалено=3 Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; Состояние("Запись файла ...."); ОкноЕхс.Workbooks(ВыбФ).Save(); ОкноЕхс.ReferenceStyle=1; ОкноЕхс.Visible=1; ОкноЕхс.Windows(ВыбФ).Visible=1; КонецПроцедуры //***************************************** Процедура ПриОткрытии() Парам=Форма.Параметр; Если (ТипЗначенияСтр(Парам)="СписокЗначений") или (ТипЗначенияСтр(Парам)="ValueList") Тогда Т=парам.ПолучитьЗначение(1); //таблица из контекста ВыбКат=парам.ПолучитьЗначение(2); ВыбФ =парам.ПолучитьЗначение(3); Лист=парам.ПолучитьЗначение(1); Если (0=ФС.СуществуетФайл(СокрЛП(ВыбКат)+"*.*")) или (СокрЛП(ВыбКат)="") или (СокрЛП(ВыбФ)="") Тогда // выбрали неверный каталог ВыбФ=""; ВыбКат=ФС.ТекКаталог(); ФС.УстТекКаталог(ВыбКат); Зн=ФС.ВыбратьФайл(1,ВыбФ,ВыбКат,"Сохранить файл как...","Файлы Excel(*.XLS)|*.XLS","XLS",10); Если ВыбФ="" Тогда СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; ЗаписатьЕксель(Т,ВыбКат,ВыбФ,Лист); СтатусВозврата(0); Возврат; КонецЕсли; //открытие без параметров!! Таблица.ИсходнаяТаблица("Пример"); Таблица.Вывести(); Таблица.Показать(); КонецПроцедуры //ПриОткрытии //***************************************** Процедура Протестировать() выббФ=""; Зн=ФС.выбратьФайл(0,ВыббФ,ВыббК,,"Файлы MXL (*.MXL) |*.MXL","MXL",10); Если ВыббФ="" Тогда Возврат КонецЕсли; Если Прав(ВыббК,1)<>"\" Тогда ВыббК=ВыббК+"\" КонецЕсли; ТестовыйФайл=ВыббК+ВыббФ; Зн=Таблица.ТолькоПросмотр(); Таблица.Очистить(); Таблица.Открыть(СокрЛП(ТестовыйФайл)); КонецПроцедуры //Протестировать //*************************************************** // // Глобальные функции и процедуры // //*************************************************** Процедура глЗаписатьВЕксель(Табл,Кат="",Файл="",Лист="Лист1") Экспорт //эту функцию нужно вынести из модуля обработки в глобальный модуль //Описание параметров - // 1) Таблица, которую нужно сохранить // 2) каталог 3) файл - при невыбранных - заставляет выбрать // 4) Название листа рабочей книги - ну уж очень не нравится мне "Sheet1"!!! Если (ТипЗначенияСтр(Табл)<>"Таблица") и (ТипЗначенияСтр(Табл)<>"Table") Тогда Возврат КонецЕсли; СпТаблица=СоздатьОбъект("СписокЗначений"); СпТаблица.ДобавитьЗначение(Табл); Кат=СокрЛП(Кат); Файл=СокрЛП(Файл); Если СОкрЛП(Кат)<>"" Тогда Если Прав(Кат,1)<>"\" Тогда Кат=Кат+"\" КонецЕсли; Если ФС.СуществуетФайл(Кат+Файл)=1 Тогда Если Вопрос("Файл "+Кат+Файл+" существует. Перезаписать?","Да+Нет")="Нет" Тогда Возврат; КонецЕсли; КонецЕсли; Если ФС.СуществуетФайл(Кат+"*.*")=0 Тогда Кат=""; КонецЕсли; КонецЕсли; СпТаблица.ДобавитьЗначение(Кат); СпТаблица.ДобавитьЗначение(Файл); СпТаблица.ДобавитьЗначение(Лист); Попытка ОткрытьФорму("Обработка.ГлКонвертацияВЕксель#",СпТаблица); Исключение Т=СпТаблица.ПолучитьЗначение(1); //таблица из контекста ВыбКат=СпТаблица.ПолучитьЗначение(2); ВыбФ =СпТаблица.ПолучитьЗначение(3); Лист=СпТаблица.ПолучитьЗначение(4); Если (0=ФС.СуществуетФайл(СокрЛП(ВыбКат)+"*.*")) или (СокрЛП(ВыбКат)="") или (СокрЛП(ВыбФ)="") Тогда // выбрали неверный каталог ВыбФ=""; Зн=ФС.ВыбратьФайл(1,ВыбФ,ВыбКат,"Сохранить файл как...","Файлы Excel|*.xls","xls",10); Если ВыбФ="" Тогда СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; ЗаписатьЕксель(Т,ВыбКат,ВыбФ,Лист); КонецПопытки; КонецПроцедуры//глЗаписатьВЕксель() //***************************************** Процедура ОбработкаЯчейкиТаблицы(Расшифровка) Если СокрЛП(Строка(Расшифровка))="КонвертироватьExcel" Тогда ГлЗаписатьВЕксель(Таблица); Возврат; КонецЕсли; // в случае использования в конфигурации // в глобальном модуле в процедуре // ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) // прописываем в самом начале строки из этой процедуры, и тогда их можно убрать отсюда // КонецПроцедуры //ОбработкаЯчейкиТАблицы //*************************************************** //*************************************************** //*************************************************** СпРазделителей=СоздатьОбъект("СписокЗначений");//стандартные разделители разрядов СпРазделителей.ДобавитьЗначение(" "); СпРазделителей.ДобавитьЗначение("."); СпРазделителей.ДобавитьЗначение(","); СпРазделителей.ДобавитьЗначение("'"); Скрипт = CreateObject("WScript.Shell"); СистемныйРазделитель = Скрипт.RegRead("HKEY_CURRENT_USER\Control Panel\International\sDecimal"); |
|||
7
аморал
08.12.05
✎
11:10
|
спасибо!!!!
Ячейка.NumberFormat=Форм; ? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |