Страница 1 из 1

Поля в SLK

Добавлено: 06 сен 2011, 10:40
maikl
Выводим отчет в SLK, из линк-формы. Хотим ужать форму за счет полей, не получается. В офисе 2003 почему то установленные поля из линк-формы не переносятся в выходную форму.
Уже замучились.
В 2007 этой проблемы нет.
Может кто знает как решить ее в 2003 офисом?

Re: Поля в SLK

Добавлено: 06 сен 2011, 13:56
Semi-bit
Если вы хотите "ужать" высоту строк, должен вас огорчить - FCOM игнорирует информацию о ней. В выходном файле, если высота строк была задана специально, эти строки "сползут", поскольку из отчёта выкусывается программная часть, а эти строки никак не обрабатываются. Выход - удалить все записи вида F;M из исходника. Эксель автоматически установит нужную высоту.
Если же надо "ужать" столбцы, поэкспериментируйте с секцией F;W. В каждой из таких строк первое число указывает начальный столбец, второе - конечный, а 3-е - ширину столбца в точках.

Re: Поля в SLK

Добавлено: 06 сен 2011, 14:21
edward_K
в общеми лучше сразу в Excel чем мучится :). Из текстовой формы это сделать достаточно легко.

Re: Поля в SLK

Добавлено: 06 сен 2011, 15:17
maikl
Нет, мы хотим уменьшить поля листа (отступы справа и слева) т.е аналогично параметрам страниц.
Не ячеек, а листа.

Re: Поля в SLK

Добавлено: 06 сен 2011, 20:17
edward_K
slk это не тот формат который позволяет это делать. Более того и макрос тяжко запустить. Хотя я когда-то ложил шаблон в автозагрузку, который при старте Excel смотрел какая книга открылась и если встретил нужную производил над ней манипуляции - но в Excel нормальный проще 8)

Re: Поля в SLK

Добавлено: 07 сен 2011, 09:29
Semi-bit
Ну, SLK позволяет изменить параметр названия генератора этого самого слк, отсюда можно плясать...
Например,
ID;PWXL;N;E
можно заменить на
ID;PSLKMEGATOOL;N;E
а шаблон или надстройка будет сначала читать поступившие slk в сыром режиме, и в зависимости от наличия метки делать свою "грязную" работу :)
C RTF ещё проще такое сделать, благо он поддерживает переменные Ворда.

Re: Поля в SLK

Добавлено: 07 сен 2011, 12:51
spark
Semi-bit писал(а):Ну, SLK позволяет изменить параметр названия генератора этого самого слк, отсюда можно плясать...
Например,
ID;PWXL;N;E
можно заменить на
ID;PSLKMEGATOOL;N;E
а шаблон или надстройка будет сначала читать поступившие slk в сыром режиме, и в зависимости от наличия метки делать свою "грязную" работу :)
C RTF ещё проще такое сделать, благо он поддерживает переменные Ворда.
А можно поподробней? Ничего не понял, но чувствую что очень нужная мне весчЪ! =)

Re: Поля в SLK

Добавлено: 07 сен 2011, 13:04
RAJAH
spark писал(а):Ничего не понял, но чувствую что очень нужная мне весчЪ! =)
:D http://www.youtube.com/watch?v=lavMXK7AuXA

Re: Поля в SLK

Добавлено: 07 сен 2011, 13:11
spark
RAJAH писал(а):
spark писал(а):Ничего не понял, но чувствую что очень нужная мне весчЪ! =)
:D http://www.youtube.com/watch?v=lavMXK7AuXA
Да, Да!! Мне пожалуйста обе буквы! :D

Re: Поля в SLK

Добавлено: 07 сен 2011, 15:09
Semi-bit
Хм, не знаю, каким боком сюда затесался Семён Фарада, дома ссылку посмотрю (на работе нормального инета нету, а тот что есть, тает с неимоверной скоростью)...

spark, надо ваш документик открыть, и заменить в нём самую первую строку вышеописанным способом. Потом можно этот файл скомпилировать випом. Затем сделайте шаблон xlt (или xltm, если у вас Excel 2007) . В шаблоне сделайте макрос и настройте его так, чтобы он запускался при открытии рабочей книги. В макросе уже можно сделать проверку на наличие вашей пометки.
Я вместо шаблонов предпочитаю делать общие надстройки Office средствами VSTO, потому что её достаточно просто установить на произвольный компьютер, и не надо заморачиваться со способом отлова события открытия документа.

Re: Поля в SLK

Добавлено: 07 сен 2011, 15:27
spark
Semi-bit писал(а):Хм, не знаю, каким боком сюда затесался Семён Фарада, дома ссылку посмотрю (на работе нормального инета нету, а тот что есть, тает с неимоверной скоростью)...

spark, надо ваш документик открыть, и заменить в нём самую первую строку вышеописанным способом. Потом можно этот файл скомпилировать випом. Затем сделайте шаблон xlt (или xltm, если у вас Excel 2007) . В шаблоне сделайте макрос и настройте его так, чтобы он запускался при открытии рабочей книги. В макросе уже можно сделать проверку на наличие вашей пометки.
Я вместо шаблонов предпочитаю делать общие надстройки Office средствами VSTO, потому что её достаточно просто установить на произвольный компьютер, и не надо заморачиваться со способом отлова события открытия документа.
Что только люди не придумают. Как это все приходит вам в головы?? =))

А можно пример макроса, который определяет нужный slk?

Re: Поля в SLK

Добавлено: 08 сен 2011, 13:14
Semi-bit
spark, конечно, можно! На VBA затрудняюсь привести код, там событие открытия документа приложением сложно отловить, поэтому решение будет на C#. Если Visual Studio у вас нет, могу прислать исходники полностью, а здесь покажу саму суть.

Подготовка:
  1. Создать общую надстройку;
  2. Выбрать Excel на вкладке "Приложения" мастера создания надстройки;
  3. Добавить ссылки на сборки Microsoft.Office.Interop.Excel, System.Windows.Forms;
  4. Поместить такой код в обработчик Connect:

    Код: Выделить всё

    using XL = Microsoft.Office.Interop.Excel;
    using System.Windows.Forms;
    using System.IO;
    
    public Connect()
    {
        XL.Application app = new XL.Application();
        app.WorkbookOpen += new XL.AppEvents_WorkbookOpenEventHandler(app_WorkbookOpen);
    }
После подготовки в функции app_WorkbookOpen пишете такой код:

Код: Выделить всё

void app_WorkbookOpen(XL.Workbook Wb)
{
    if (Wb.FileFormat == XL.XlFileFormat.xlSYLK)
    {
        StreamReader sr = new StreamReader(Wb.FullName);
        string header = sr.ReadLine();
        sr.Close();
        if (header.Contains("SLKMEGATOOL"))
        {
            MessageBox.Show("Открыта нужная книга!");
            XL.Worksheet activeSheet = Wb.ActiveSheet;
            activeSheet.PageSetup.LeftMargin = Wb.Application.InchesToPoints(0.25);
            activeSheet.PageSetup.RightMargin = Wb.Application.InchesToPoints(0.25);
            activeSheet.PageSetup.TopMargin = Wb.Application.InchesToPoints(0.75);
            activeSheet.PageSetup.BottomMargin = Wb.Application.InchesToPoints(0.75);
            activeSheet.PageSetup.HeaderMargin = Wb.Application.InchesToPoints(0.3);
            activeSheet.PageSetup.FooterMargin = Wb.Application.InchesToPoints(0.3);
        }
    }
}
Теперь, подключив эту надстройку к Экселю (для этого автоматически создаётся установщик), мы сможем проверять, какая книга поступила на открытие. Небольшой минус - необходимо установить её на каждый компьютер. Впрочем, если у вас правильно настроен домен, проблем возникнуть не должно.