Макрос сбрасывает форматирование

Автор kokosergei, 29 ноября 2023, 09:16

0 Пользователи и 1 гость просматривают эту тему.

kokosergei

Приветствую, использую макрос по копированию данных из csv в calc. После выполнения макроса всё форматирование таблицы обнуляется, с этим можно что то сделать? Макрос был взят с этого форума, пробовал на windows 7 версия Calc 7.0.3.1 и на windows 10 версия 7.5.1.2
Вот сам макрос:

Sub ImportCSV 'импорт диапазона oSource по адресу oCellAddress
Dim oCellAddress as new com.sun.star.table.CellAddress, sURL$, oSource$, FilterName$, FilterOptions$
    oCellAddress.Sheet=0
    oCellAddress.Row=0
    oCellAddress.Column=44
    sURL="file:///C:/Users/Sergei/Desktop/"  & ThisComponent.Sheets.getByName("MAIN").getCellRangeByName("E1").String & ".csv"
    oSource="A1:E400"
    FilterName="Text - txt - csv (StarCalc)"
    FilterOptions="44,34,76,1,,1037"
    ThisComponent.AreaLinks.insertAtPosition(oCellAddress,sUrl,oSource,FilterName,FilterOptions)
    ThisComponent.AreaLinks.removeByIndex(0)
End Sub

bigor

Добрый день.
Как вариант вставлять данные из файла в промежуточный лист, а из него getDataArray и setDataArray в форматированный.
Поддержать наш форум можно здесь

kokosergei


mikekaganski

Пока 158432 не будет реализовано, можно также включить в скрипт явную установку формата после вставки данных.
С уважением,
Михаил Каганский

kokosergei

Цитата: mikekaganski от 29 ноября 2023, 09:50Пока 158432 не будет реализовано, можно также включить в скрипт явную установку формата после вставки данных.
Если через Python, тоже самое будет?

mikekaganski

В ЛО/AOO нет разницы, на каком языке Вы вызываете его API.
С уважением,
Михаил Каганский

kokosergei

Цитата: mikekaganski от 29 ноября 2023, 10:46В ЛО/AOO нет разницы, на каком языке Вы вызываете его API.
То есть не получится даже если не просто импортировать диапазон таблицы, а по вставлять значения например создав list, а потом через цикл for?

mikekaganski

Почему не получится? bigor предложил именно такого рода решение (только лучше). Это другое API, и устанавливая данные ячеек напрямую, Вы не затрагиваете их форматирование. Обратите внимание, что мой ответ был "... можно также ...", то есть как альтернатива предложенному выше решению.
С уважением,
Михаил Каганский

kokosergei

Ааа, всё понял, не врубился с утра по началу... спасибо!

economist

Макросы с AreaLinks, Данные-Задать диапазон, диапазоны из Баз данных и др. способы, "убивающие" форматы при обновлении - становятся незаменимыми, если важна скорость и объем строк большой (десятки тыс.)

План Б: Если речь не о цветах/жирности/заливке, а лишь о формате самих чисел (излишняя точность, ведущие нули, дробные вместо целых итд) - то "исходник" в CSV можно до загрузки изменить внешними утилитами (например в Pandas). Главное не забывать что всякие коды типа ИНН обязаны быть не-числами (закавычены).

Также неожиданно хорошо "зашла" пользователям штатная функция Alt+F12 - ...Calc - Вид - Выделение значений цветом. Синие 123,45 числа навсегда убрали проблему неправильного десятичного знака (тчк вместо зпт и наоборот) и криво распознанных/введенных дат. Кол-во обращений в техподдержку конторы снизилось на 20% - так часто это проблема возникала. Юзеры любят задавать выравнивание вправо и никак не видят что ввели вместо числа - текст.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: economist от 29 ноября 2023, 12:16Главное не забывать что всякие коды типа ИНН обязаны быть не-числами (закавычены).

Нужно добавить, что "закавыченность" в CSV не означает автоматически текстовый тип данных. Стандарт CSV вообще не различает никаких типов, и кавычки в формате (согласно стандарту) используются только как разделители полей, полезные при необходимости маскировать определённые символы (но также применимые и без таких символов).

Например, при разделителе полей - запятая, если числа также используют запятую как десятичный разделитель, единственный способ представить такие числа в этом CSV- заключать их в кавычки.

Поэтому если делается импорт с "закавыченными" данными, и пользователь хочет, чтобы они приходили строго как текст, нужно либо использовать соответствующую глобальную опцию (токен 7), либо задать текстовый тип непосредственно нужному полю (токен 5). Иначе даже закавыченные данные вида "01234567890123456789" могут прийти как числа типа 1,234567E+018.
С уважением,
Михаил Каганский

kokosergei

#11
Кому надо, вот рабочий макрос на Python для Calc импорта данных из csv c сохранением всех форматов
import csv
import uno

csv_path = "C:/path/name.csv"
sheet_name = "Sheet1"
start_range = "A1"
end_range = "E400"

def import_csv_to_calc(args=None):
    ctx = uno.getComponentContext()
    smgr = ctx.getServiceManager()
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    model = desktop.getCurrentComponent()
    sheets = model.Sheets
    sheet = sheets.getByName(sheet_name)

    with open(csv_path, "r", encoding='UTF-8') as csv_file:
        csv_reader = csv.reader(csv_file, delimiter=',')
        data = list(csv_reader)
        rows = len(data)
        cols = len(data[0])

        range_address = f"{start_range}:{end_range}"
        target_range = sheet.getCellRangeByName(range_address)

        for i in range(rows):
            for j in range(cols):
                cell = target_range.getCellByPosition(j, i)
                cell.String = str(data[i][j])

bigor

Цитата: kokosergei от 29 ноября 2023, 15:52cell.String = str(data[j])
не верно воспроизводится в вашем сообщении. Прикольно в режиме редактирования вижу data открываюшая квадратная скобка i  закрывающая квадратная скобка [j] а при сохранении только [j]
Поддержать наш форум можно здесь

kokosergei

#13
Цитата: bigor от 29 ноября 2023, 17:03
Цитата: kokosergei от 29 ноября 2023, 15:52cell.String = str(data[j])
не верно воспроизводится в вашем сообщении. Прикольно в режиме редактирования вижу data открываюшая квадратная скобка i  закрывающая квадратная скобка [j] а при сохранении только [j]

Ну да, что-то не получается исправить, в этом сообщении тоже так получается [j]. Баг какой-то)))

mikekaganski

Цитата: bigor от 29 ноября 2023, 17:03
Цитата: kokosergei от 29 ноября 2023, 15:52cell.String = str(data[j])
не верно воспроизводится в вашем сообщении. Прикольно в режиме редактирования вижу data открываюшая квадратная скобка i  закрывающая квадратная скобка [j] а при сохранении только [j]

Ещё бы. Ведь i в квадратных скобках - это markdown для курсива. Для кода есть тэг [code].
С уважением,
Михаил Каганский