# -*- 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. 本地部署JAVA SE环境

    一.下载安装JDK: 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-doc-downloads-2133158. ...

  2. jpa使用过程中出现问题记录[持续更新]

    1.自定义JPQL语句,出现Not supported for DML operations 错误. 解决方案:在@Query注解上面加上@Modifying注解. //出现问题的代码 @Query( ...

  3. docker的基本知识

    Docker 是什么? Docker 是一个开源的应用容器引擎,是基于go语言的,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. ...

  4. leetcode 678. Valid Parenthesis String

    678. Valid Parenthesis String Medium Given a string containing only three types of characters: '(', ...

  5. Swing 混合布局

    案例一:Border边境边界 package swing; /** * swing 混合布局 */ import java.awt.*; import javax.swing.*; public cl ...

  6. phpcms不能批量更新栏目页和内容页

    需要给网站根目录更加users用户的写入权限.

  7. 遍历HashMap的四种方式

    转至:https://www.cnblogs.com/Berryxiong/p/6144086.html public static void main(String[] args) { Map< ...

  8. (light oj 1319) Monkey Tradition 中国剩余定理(CRT)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1319 In 'MonkeyLand', there is a traditional ...

  9. mybatis中常见的问题总结

    如下所有举例基于springboot+mybatis项目中,SSH使用mybatis的写法也一样,只是形式不同而已 问题1.org.apache.ibatis.binding.BindingExcep ...

  10. servlet(6) 链接数据库

    一.servlet链接mysql步骤: 1.注册驱动器:Class.forName("com.mysql.jdbc.Driver"); 加载类并执行下面的静态语句块,将Driver ...