Python需要将巨大的excel拆分为小的excel。编码不起作用
我有一个很大的excel,我需要把它分成几个小的(我正在使用python)。它应该把大excel的每300行写入小excel的前300行(每个小excel应该有300行或更少,最后一行)。大excel只是一个excel,元素位于第一列(A:A),大约有8000行(单元格包含电子邮件) 代码如下:Python需要将巨大的excel拆分为小的excel。编码不起作用,python,excel,Python,Excel,我有一个很大的excel,我需要把它分成几个小的(我正在使用python)。它应该把大excel的每300行写入小excel的前300行(每个小excel应该有300行或更少,最后一行)。大excel只是一个excel,元素位于第一列(A:A),大约有8000行(单元格包含电子邮件) 代码如下: from xlrd import open_workbook import xlsxwriter wb = open_workbook('BBDD_POLAROID_TOTAL.xlsx') exc
from xlrd import open_workbook
import xlsxwriter
wb = open_workbook('BBDD_POLAROID_TOTAL.xlsx')
excel_num = 0
print('ARCHIVO: ' + str(excel_num))
workbook = xlsxwriter.Workbook('BBDD' + str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
for s in wb.sheets():
number_of_rows = s.nrows
for row in range(number_of_rows):
if row % 300 == 0:
print('close: ' + str(excel_num))
workbook.close()
excel_num += 1
print('ARCHIVO: ' + str(excel_num))
workbook = xlsxwriter.Workbook('BBDD' + str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
print('all good: ' + str(excel_num))
print(str(row) + s.cell(row, 0).value)
worksheet.write(row, 0, s.cell(row, 0).value)
我不明白为什么这个代码不起作用。它实际上包装了所有的EXCEL,但只在第二个上写(第一个只是打开和关闭)
谢谢你的帮助 这个代码就是我想要的。但我还是不明白为什么其他代码是错的。如果有人知道答案,我会很高兴 PD:打印只是为了查看文件是如何编写的
from xlrd import open_workbook
import xlsxwriter
wb = open_workbook('BBDD_POLAROID_TOTAL.xlsx')
archivo = [[]]
excel_num = 0
for s in wb.sheets():
number_of_rows = s.nrows
for row in range(number_of_rows):
print(str(excel_num) + ' ' + str(row) + ' ' + s.cell(row, 0).value)
archivo[excel_num].append(s.cell(row, 0).value)
if row % 300 == 0 and row != 0:
archivo.append([])
excel_num += 1
for name in range(len(archivo)):
workbook = xlsxwriter.Workbook('BBDD' + str(name) + '.xlsx')
worksheet = workbook.add_worksheet()
for mail_index in range(len(archivo[name])):
print(str(name) + ' ' + str(mail_index) + ' ' + archivo[name][mail_index])
worksheet.write(mail_index, 0, archivo[name][mail_index])
workbook.close()
出于我在评论中提到的原因,这里有一个可能的解决方法:
from xlrd import open_workbook
import xlsxwriter
wb = open_workbook('BBDD_POLAROID_TOTAL.xlsx')
excel_num = 0
print('ARCHIVO: ' + str(excel_num))
workbook = xlsxwriter.Workbook('BBDD' + str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
for s in wb.sheets():
number_of_rows = s.nrows
for row in range(0, number_of_rows):
if row % 300 == 0:
if row == 0:
print(str(row) + s.cell(row, 0).value)
worksheet.write(row%300, 0, s.cell(row, 0).value)
else:
print('close: ' + str(excel_num))
workbook.close()
excel_num += 1
print('ARCHIVO: ' + str(excel_num))
workbook = xlsxwriter.Workbook('BBDD' + str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
print('all good: ' + str(excel_num))
print(str(row) + ' ' + s.cell(row, 0).value)
worksheet.write(row%300, 0, s.cell(row, 0).value)
workbook.close()
**我还有更好的专栏**
#-*-编码:utf-8-*-
"""
创建于2020年7月27日星期一17:01:57
@作者:Vishal Yadav
"""
从xlrd导入打开的\u工作簿
导入xlsxwriter
file\u path='E:\project\file\u to\u be\u splitted.xls'
输出\u路径='E:\project\splitter\u输出'
行分割计数=990
wb=打开工作簿(文件路径)
excel_num=0
工作簿=xlsxwriter.workbook(输出路径+'\\'+str(excel数值)+'.xlsx')
工作表=工作簿。添加工作表()
对于wb.sheets()中的s:
行数=s.nrows
cols的数量=s.ncols
打印(行数)
打印(列数)
对于范围内的行(0,行数):
对于范围内的列(0,列数):
如果(行%row\u split\u count==0和行!=0和row\u split\u count):
工作表。写入(行分割计数-1,列,s单元格(行,列)。值)
如果(col==cols-1的个数):
工作簿.关闭()
excel\u num=excel\u num+1
工作簿=xlsxwriter.workbook(输出路径+'\\'+str(excel数值)+'.xlsx')
工作表=工作簿。添加工作表()
elif(row)到目前为止,这也让我很困惑,我想我找到了问题所在,但我还不知道如何解决。问题是如果行%300==0,那么第一行的行是True
(row==0
,0%300==0
是True
),因此它会关闭工作簿,并重复从第1行开始的循环。如果我能找到什么,我会更新,除非你能修复它。我制作了一个工作正常的代码。不漂亮,但它成功了。谢谢你的帮助!如果你知道如何修复代码,我会很高兴,我仍然有疑问。当然,我可以发布一个链接到我的“修复”,或作为此处的答案,但它可能并不比您在下面提供的答案更好。不管怎样,只要您将其修复,可能就足以满足您的需要。我基本上添加了第二个if
条件:if row%300==0:if row==0:print(str(row)+s.cell(row,0).value);工作表.write(行%300,0,s.cell(行,0).value);else:print('close:'+str(excel_num))
你看过我的评论了吗?我在评论中提到了它不起作用的原因。我刚刚完成了一个类似的解决方案的测试,这个解决方案可能并不比你这里的更好。但是我认为任何解决方案都需要处理第一行,即第0行的条件,如果第%300行==0:
为真的话你可能是对的。我认为错误可能就在那里。好的,无论哪个解决方案对你来说是“解决方案”并且可以满足您的需要。主要目标是它可以正常工作。很高兴看到您能够正常工作。另外,在原始代码中,每个文件不是从第0行开始,而是从下一行开始,因此每个拆分文件都不小于原始文件,并且填充了空行。在这里,使用“worksheet.write”(行%300..`等,每个小excel将显示300行或更少
**I have something better for columns also**
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 27 17:01:57 2020
@author: Vishal Yadav
"""
from xlrd import open_workbook
import xlsxwriter
file_path='E:\project\file_to_be_splitted.xls'
output_path='E:\project\splitter_output'
row_split_count=990
wb = open_workbook(file_path)
excel_num = 0
workbook = xlsxwriter.Workbook(output_path+'\\'+str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
for s in wb.sheets():
number_of_rows = s.nrows
number_of_cols = s.ncols
print(number_of_rows)
print(number_of_cols)
for row in range(0, number_of_rows):
for col in range(0, number_of_cols):
if(row % row_split_count == 0 and row!=0 and row<=row_split_count):
worksheet.write(row_split_count, col, s.cell(row, col).value)
if(col == number_of_cols-1):
workbook.close()
excel_num=excel_num+1
workbook = xlsxwriter.Workbook(output_path+'\\'+str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
elif(row % row_split_count == 0 and row!=0 and row>row_split_count):
worksheet.write(row_split_count-1, col, s.cell(row, col).value)
if(col == number_of_cols-1):
workbook.close()
excel_num=excel_num+1
workbook = xlsxwriter.Workbook(output_path+'\\'+str(excel_num) + '.xlsx')
worksheet = workbook.add_worksheet()
elif(row<row_split_count):
worksheet.write(row % row_split_count, col, s.cell(row, col).value)
else:
worksheet.write((row % row_split_count)-1, col, s.cell(row, col).value)
workbook.close()