Python需要将巨大的excel拆分为小的excel。编码不起作用

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

我有一个很大的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')
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()