xlsxwriter: есть ли способ открыть существующий рабочий лист в моей книге?

Я могу открыть свою уже существующую книгу, но я не вижу способа открыть уже существующие листы в этой книге. Есть какой-либо способ сделать это?


person Nick    schedule 01.08.2013    source источник
comment
Библиотека xlsxwriter предназначена для записи файлов Excel — она не может их читать.   -  person alecxe    schedule 08.08.2013
comment
см. этот stackoverflow.com/questions/18849535/   -  person shellbye    schedule 15.02.2014


Ответы (3)


Вы не можете добавить к существующему файлу xlsx xlsxwriter.

Существует модуль под названием openpyxl, который позволяет вам читать и записывать в уже существующий файл excel, но я уверен, что этот метод включает чтение из файла excel, сохранение всей информации каким-либо образом (база данных или массивы), а затем перезапись при вызове workbook.close(), который затем запишет всю информацию в ваш файл xlsx.

Точно так же вы можете использовать собственный метод «добавления» к документам xlsx. Недавно мне пришлось добавить в файл xlsx, потому что у меня было много разных тестов, в которых данные GPS поступали на основной рабочий лист, а затем мне приходилось добавлять новый лист каждый раз, когда начинался тест. Единственный способ обойти это без openpyxl — прочитать файл excel с помощью xlrd, а затем просмотреть строки и столбцы. ...

i.e.

cells = []
for row in range(sheet.nrows):
    cells.append([])
    for col in range(sheet.ncols):
        cells[row].append(workbook.cell(row, col).value)

Однако вам не нужны массивы. Например, это прекрасно работает:

import xlrd
import xlsxwriter

from os.path import expanduser
home = expanduser("~")

# this writes test data to an excel file
wb = xlsxwriter.Workbook("{}/Desktop/test.xlsx".format(home))
sheet1 = wb.add_worksheet()
for row in range(10):
    for col in range(20):
        sheet1.write(row, col, "test ({}, {})".format(row, col))
wb.close()

# open the file for reading
wbRD = xlrd.open_workbook("{}/Desktop/test.xlsx".format(home))
sheets = wbRD.sheets()

# open the same file for writing (just don't write yet)
wb = xlsxwriter.Workbook("{}/Desktop/test.xlsx".format(home))

# run through the sheets and store sheets in workbook
# this still doesn't write to the file yet
for sheet in sheets: # write data from old file
    newSheet = wb.add_worksheet(sheet.name)
    for row in range(sheet.nrows):
        for col in range(sheet.ncols):
            newSheet.write(row, col, sheet.cell(row, col).value)

for row in range(10, 20): # write NEW data
    for col in range(20):
        newSheet.write(row, col, "test ({}, {})".format(row, col))
wb.close() # THIS writes

Однако я обнаружил, что было проще читать данные и сохранять их в двумерном массиве, потому что я манипулировал данными и получал входные данные снова и снова и не хотел записывать в файл excel, пока не закончится тест. (что вы могли бы так же легко сделать с помощью xlsxwriter, поскольку, вероятно, они так и делают, пока вы не вызовете .close()).

person dylnmc    schedule 04.08.2014
comment
Я бы не сказал, что это очень сложная структура. Структура представляет собой просто zip-архив листов, в котором каждый лист представляет собой XML-файл с содержимым ячейки. Доступ, чтение и редактирование довольно просты, просто XlsxWriter намерен быть писателем. Не читатель. - person Alexander Huszagh; 21.12.2015
comment
@AlexanderHuszagh: Я думаю, насколько сложным это кажется, зависит от того, что вы пытаетесь получить от этого. Если вам просто нужны значения ячеек, то это действительно довольно просто читать. Но если вы хотите извлечь формулы, форматирование и тому подобное, это не так просто. Может быть, все еще не очень сложный, но достаточно сложный, чтобы никто не спешил затыкать функциональные пробелы в xlrd и OpenPyXL. (Даже POI Apache, написанный на Java, имеет несколько пробелов.) Кроме того, я думаю, что он достаточно сложен, чтобы вы могли испортить уже существующий файл, если попытаетесь записать в него, не зная, что делаете. - person John Y; 09.01.2016

Немного поискав способ открытия существующего листа в xlxs, я обнаружил

existingWorksheet = wb.get_worksheet_by_name('Your Worksheet name goes here...')
existingWorksheet.write_row(0,0,'xyz')

Теперь вы можете добавлять/записывать любые данные на открытый рабочий лист. Я надеюсь, что это помогает. Спасибо

person Dikshit Kathuria    schedule 30.08.2018
comment
Привет, как открыть рабочую тетрадь для чтения/записи? Когда я пробовал эту функцию, она могла получить рабочий лист только после того, как он был создан вашим скриптом. Согласно документации, вы не можете читать или изменять (xlsxwriter.readthedocs.io/ введение.html) - person Jean-Francois T.; 13.12.2018

Вы можете использовать функцию workbook.get_worksheet_by_name(): https://xlsxwriter.readthedocs.io/workbook.html#get_worksheet_by_name

Согласно https://xlsxwriter.readthedocs.io/changes.html, функция была добавлена 13 мая 2016 года.

«Выпуск 0.8.7 — 13 мая 2016 г.

-Исправлена ​​проблема при вставке изображений только для чтения в Windows. Выпуск №352.

-Добавлен метод get_worksheet_by_name(), позволяющий извлекать рабочий лист из рабочей книги по его имени.

-Исправлена ​​проблема, из-за которой даты создания и изменения внутренних файлов указывались в местном часовом поясе, а не в формате UTC.

person jeppoo1    schedule 17.12.2019
comment
Это работает только для книги/листа, созданного с помощью XlsxWriter. XlsxWriter не может прочитать существующий файл. - person jmcnamara; 17.12.2019
comment
Приятно знать @jmcnamara! Я просто боролся с получением ошибки Nonetype при попытке доступа к существующему фиктивному файлу, и это объясняет ошибку. - person jeppoo1; 17.12.2019