# -*- coding:utf-8 _*-
"""
@author:Administrator
@file: excel.py
Description :
如果行数是1000的倍数,进行一次flush,如果行数超过65536,
新开一个sheet,如果超过3个sheet,则新建一个文件
@time: 2018/10/31
"""
import os
import xlwt
from xlrd import open_workbook
from xlutils.copy import copy
from configs.config import ConfigENum

MAX_ROW_NUM = 65536
MAX_SHEET_NUM = 3

class XLS:
def __init__(self, name, captionlist: list, typelist: list, encoding='utf8', flushBound=1000):
"""

:type captionlist: list
:type typelist: list
"""
self.name = name
self.captionlist = captionlist[:]
self.typeList = typelist[:]
self.encoding = encoding
self.flushBound = flushBound
self.bk = xlwt.Workbook(encoding=self.encoding, style_compression=0)
self.workbookIndex = 1
self.row = 0
self.excel_name = None
self.sheet = None
self.sheetindex = 0
# self._add_sheet()

def _add_sheet(self):
if self.sheetindex != 0:
# This method is used to save the Workbook to a file in native Excel format.
self.bk.save(self.name + str(self.sheetindex) + ".xls")
# create new workbook
if self.sheetindex > MAX_SHEET_NUM:
self.workbookIndex += 1
self.bk = xlwt.Workbook(encoding=self.encoding, style_compression=0)
self.sheetindex = 1
# a new sheet
index=self.sheetindex
print("self.sheet_index=",index)
self.sheet = self.bk.add_sheet(self.name +
index.__str__(),
cell_overwrite_ok=False)
for i in range(len(self.captionlist)):
# This method is used to write a cell to a :class:`Worksheet`
self.sheet.write(0, i, self.captionlist[i])

self.row = 1

def write(self, data: list):
"""
:type data: list
"""
# The row of current sheet > the max rows of sheet then create a new sheet
if self.row > MAX_ROW_NUM:
self.sheetindex += 1
self._add_sheet()
self._add_sheet()
for i in data:
for j in range(len(i)):
if self.typeList[j] == "num":
try:
self.sheet.write(self.row, j, float(i[j]))
except:
raise ValueError("{} is not a number".format(i[j]))
else:
self.sheet.write(self.row, j, i[j])
# when rows =1000 then flush rows
if self.row % self.flushBound == 0:
self.sheet.flush_row_data()
self.row += 1

@staticmethod
def __find_file(keyword):
for root, d, files in os.walk(ConfigENum.DATA_PATH.value):
for file in files:
if keyword in file:
file = os.path.join(root, file)
return file
return False

def add_write(self, datas):

result=self.__find_file(self.name)
if not result:
self.write(datas)
self.save()
return "ok"

if self.row > MAX_ROW_NUM:
self.sheetindex += 1
self._add_sheet()

# read a excel file
self.bk = open_workbook(result)
# get the rows of sheet
rows = self.bk.sheets()[self.sheetindex].nrows
# Copy an :class:`xlrd.Book` into an :class:`xlwt.Workbook`
excel = copy(self.bk)

self.sheet = excel.get_sheet(self.sheetindex)
self.row = rows
for data in datas:
# [1,2,3,4]
for j in range(len(data)):
self.sheet.write(self.row, j, data[j]) # xlwt对象的写方法,参数分别是行、列、值
if self.row % self.flushBound == 0:
self.sheet.flush_row_data()
self.row += 1
self.excel_name = os.path.join(ConfigENum.DATA_PATH.value,
self.name + self.workbookIndex.__str__() + ".xls")
excel.save(self.excel_name)

def save(self):
self.excel_name = os.path.join(ConfigENum.DATA_PATH.value,
self.name + self.workbookIndex.__str__() + ".xls")
self.bk.save(self.excel_name)
# if __name__ == "__main__":

# caption_list = ["name", "gender", "age"]
# type_list = ["str", "str", "num"]
# input_data = ["Lili", "M", 25]
# excl=XLS("test",caption_list,type_list)
# excl.write(input_data)
# excl.save()

python excel写入及追加写入的更多相关文章

  1. python3读取、写入、追加写入excel文件

    由于excel版本不同,python处理的时候选择的库页不同. 一.操作对应版本表格需要用到的库 1.操作xls格式的表格文件,需要用到的库如下: 读取:xlrd 写入:xlwt 修改(追加写入):x ...

  2. php写入、追加写入文件的实例

    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $t ...

  3. Python 操作Excel之通过xlutils实现在保留原格式的情况下追加写入数据

    在Python操作Excel 的模块有 xlrd.xlwt.xlutils等. xlrd:读取Excel文件数据 xlwt:写入Excel 数据,缺点是Excel格式无法复用,为了方便用户,写入的话, ...

  4. JS+Selenium+excel追加写入,使用python成功爬取京东任何商品~

    之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...

  5. Python Excel 多sheet 多条数据 自定义写入

    pip install xlwt python excel 数据写入操作,处理网站数据导出以及不是太多数据的爬虫存储, 用处蛮多的轮子. (150+++++++++++++++++++++++++++ ...

  6. python:创建文件夹:写入文本1:读取txt:读取Excel文件遍历文件夹:

    https://blog.csdn.net/u011956147/article/details/80369731 创建文件夹: import osimport shutil def buildfil ...

  7. 解决python中csv文件中文写入问题

    一.前言 一般来说,为了方便,使用python的时候都会使用csv模块去写数据到csv文件,但是写入中文的时候,经常会报错: UnicodeEncodeError: 'ascii' codec can ...

  8. Java基础知识强化之IO流笔记20:FileOutputStream写出数据实现换行和追加写入

    1.  如何实现数据的换行? (1) package com.himi.fileoutputstream; import java.io.FileNotFoundException; import j ...

  9. ObjectOutputStream 追加写入读取错误 - 自己的实现方案

    本篇博客灵感来自http://blog.csdn.net/chenssy/article/details/13170015 问题描述.问题出现的原因.尝试解决办法,请参见鄙人上一编博客. 上一编文章解 ...

随机推荐

  1. Redis中5种数据结构的使用场景

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  2. oracle 当前年到指定年的年度范围求取

    如下面公式所示,求取2015到当前年(2018)的年度范围,当前年是由系统获取的,用到了sysdate和函数to_char,to_date. 当然,当前年也可以换成指定年份 SELECT TO_CHA ...

  3. Linux(Manjaro) -Docker 安装及基本配置

    Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...

  4. windows server 几大实时同步软件比较

    需求: 从Windows Server 主机A 到 Windows Server 主机B 之间同步目录 方案一: 1. 使用bat脚本 + 计划任务的方式 1.1 bat脚本 功能: 把主机A的C:\ ...

  5. Java基础系列--04_数组

    一维数组: (1)数组:存储同一种数据类型的多个元素的容器. (2)特点:每一个元素都有编号,从0开始,最大编号是数组的长度-1. 编号的专业叫法:索引 (3)定义格式 A:数据类型[] 数组名;(一 ...

  6. CentOS6.9安装WordPress搭建自己的博客网站

    首先说明我用的是服务器上之前装的mysql数据库,只需要配置上就行了 准备工作 CentOS6.9 在/目录下创建一个目录src,把下载的东西都放到这个文件夹下 下载Apache Httpd,下载地址 ...

  7. mybatis insertUseGeneratedKeys 返回主键为null

    package tk.mybatis.mapper.common.special; import org.apache.ibatis.annotations.InsertProvider; impor ...

  8. 【原创】那些年用过的Redis集群架构(含面试解析)

    引言 今天是2019年2月12号,也就是大年初八,我接到了高中同学刘有码面试失利的消息. 他面试的时候,身份是某知名公司的小码农一枚,却因为不懂自己生产上Redis是如何部署的,导致面试失败! 人间惨 ...

  9. Git使用(积累一些常用的命令)

    1. 取消某一次合并  git merge --abort 可以参考的教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248 ...

  10. iOS截屏并修改截图然后分享的功能实现

    一. 实现的效果类似微博的截图分享 不仅截图分享的时候还进行图片的修改,增加自己的二维码 二.实现方式 苹果在ios7之后提供了一个新的通知类型:UIApplicationUserDidTakeScr ...