簡體   English   中英

使用 python 將段從一個 Excel 文件復制到另一個:xlrd 和 xlsxwriter

[英]Copying the segment from one Excel file to another with python: xlrd and xlsxwriter

我正在嘗試將 Excel 工作表的整個部分復制到另一個文件。 該段實際上是一個標題/描述,主要描述文件的屬性、創建日期等......所有這些都需要前五行和前三列的一些單元格,比如來自 A1:C3。 這是我編寫的代碼(例如,僅用於 3 行):

import xlsxwriter
import xlrd


#### open original excelbook
workbook = xlrd.open_workbook('hello.xlsx')
sheet = workbook.sheet_by_index(0)
# list of populated header rows
row_header_list = ['A1','A2','A3','A4','A5']
i = 0
c = 0
while c <= 2:
#### read original xcel book 3 rows by loop - counter is futher below
         data = [sheet.cell_value(c, col) for col in range(sheet.ncols)]
         #print data
#### write rows to the new excel book

         workbook = xlsxwriter.Workbook('tty_header.xlsx')
         worksheet = workbook.add_worksheet()
         worksheet.write_row(row_header_list[i], data)
         print i,c,row_header_list[i], data
         i+=1
         c+=1
         print "new i is", i, "new c is", c, "list value", row_header_list[i],"data is", data
         workbook.close()

計數器、數據、列表值 - 根據打印命令,一切似乎都是正確和准時的,但是,當我運行此代碼時,在新創建的文件中,只有第 3 行被填充,第 1 行和第 2 行是空的。 不明白為什么......為了測試這個問題,做了另一個例子——一個非常不雅的例子——沒有循環、控制列表等——只是生硬的方法:

import xlsxwriter
import xlrd

# open original excelbook
workbook = xlrd.open_workbook('hello.xlsx')
sheet = workbook.sheet_by_index(0)
data1 = [sheet.cell_value(0, col) for col in range(sheet.ncols)]
data2 = [sheet.cell_value(1, col) for col in range(sheet.ncols)]
data3 = [sheet.cell_value(2, col) for col in range(sheet.ncols)]
data4 = [sheet.cell_value(3, col) for col in range(sheet.ncols)]

### new excelbook
workbook = xlsxwriter.Workbook('tty_header2.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write_row('A1', data1)
worksheet.write_row('A2', data2)
worksheet.write_row('A3', data3)
worksheet.write_row('A4', data4)

workbook.close()

在這種情況下,一切正常,所有需要的數據都被傳輸了。 任何人都可以解釋我第一個有什么問題? 謝謝你。

我遇到的其他問題是,如果我在放置標題后開始填充列,則標題值變為 NULL。 盡管如此,還是從“標題”單元格下方的單元格開始列填充(在代碼中,我在其下方提供了第 1 列,從單元格 6 開始。有關如何解決它的任何想法?

workbook = xlrd.open_workbook('tty_header2.xlsx.xlsx')
sheet = workbook.sheet_by_index(0)

data = [sheet.cell_value(row, 2) for row in range(23, sheet.nrows)]
print  data

##### writing new file with xlswriter 
workbook = xlsxwriter.Workbook('try2.xlsx')
worksheet = workbook.add_worksheet('A')
worksheet.write_column('A6', data)
workbook.close()

更新:這是經過 Mike 更正后的修訂代碼:

import xlsxwriter
import xlrd


# open original excelbook and access first sheet
workbook = xlrd.open_workbook('hello_.xlsx')
sheet = workbook.sheet_by_index(0)

# define description rows
row_header_list = ['A1','A2','A3','A4','A5']
i = 0
c = 0

#create second file, add first sheet
workbook2 = xlsxwriter.Workbook('try2.xlsx')
worksheet = workbook2.add_worksheet('A')

# read original xcel book 5 rows by loop - counter is futher below
while c <= 5:

         data = [sheet.cell_value(c, col) for col in range(1,5)]
#print data


# write rows to the new excel book

         worksheet.write_row(row_header_list[i], data)
#   print "those are initial values",i,c,row_header_list[i], data
         i+=1
         c+=1
#  print "new i is", i, "new c is", c, "list value", row_header_list[i],"data is", data



####### works !!! xlrd - copy some columns, disclaiming 23 first rows and writing data to the new file


columnB_data = [sheet.cell_value(row, 2) for row in range(23, 72)]
print  columnB_data

##### writing new file with xlswriter - works, without (!!!) converting data to tuple
worksheet.write_column('A5', columnB_data)

columnG_data = [sheet.cell_value(row, 6) for row in range(23, 72)]
#worksheet = workbook.add_worksheet('B')
print columnG_data
worksheet.write_column('B5', columnG_data)

worksheet = workbook.add_worksheet('C')
columnC_dta = [sheet.cell_value(row, 7) for row in range(23, 72)]
print columnC_dta
worksheet.write_column('A5', columnC_dta)

#close workbook2
workbook2.close()

運行此程序后,我收到以下錯誤“回溯(最近一次調用最后一次):文件“C:/Users/Michael/PycharmProjects/untitled/cleaner.py”,第 28 行,在 worksheet.write_row(row_header_list[i], data)索引錯誤:列表索引超出范圍異常異常:異常('在工作簿析構函數中捕獲異常。工作簿可能需要顯式關閉()。',)在> 忽略”。 “第 28 行”指的是:

worksheet.write_row(row_header_list[i], data)

從開始到結束循環運行整個段似乎很好並提供正確的輸出,因此問題在下面。 如果我按照建議使用顯式關閉方法,我將無法再次使用 add_sheet 方法,因為它會覆蓋我當前的工作表。 在提供的文檔中有“sheet.activate”和“sheet.select”方法,但它們似乎是出於外觀改進的原因。 我試圖將 xlsxwriter 的工作放入一個不同的變量中(盡管如果我將所有“復制”過程放在頂部,我不會將“工作簿”覆蓋) - 沒有幫助

您在每個循環中創建具有相同名稱的新輸出文件:

while c <= 2:
     #...
     workbook = xlsxwriter.Workbook('tty_header.xlsx')
     worksheet = workbook.add_worksheet()

因此,您會在每個循環中覆蓋文件,並且只保存最后一行。

只需將其移出循環:

workbook = xlsxwriter.Workbook('tty_header.xlsx')
worksheet = workbook.add_worksheet()
while c <= 2:
     #...

workbook.close()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM