hutool实现图片写入excel_图片转Excel表格 ORC写入Excel文件

本文讲述了作者在无法直接拷贝数据的情况下,如何利用夸克浏览器的AI识别和阿里云OCR服务将图片转换成Excel表格。通过Python的xlwt库实现了将OCR解析的JSON数据写入Excel。
摘要由CSDN通过智能技术生成

f8c6def7f43343f095164008bf52bb77.png

最近工作当中,数据不能从生产电脑拷贝出来,只能手抄或者拍照下来,然后再录入电脑。这么low的操作,作为半个码农,怎么会手工录入呢,所以找了各种图片转表格的网站,小程序,要么就收费,要么就是精确度不够高。

通过一番操作,发现夸克浏览器里面的AI识别准确度还挺高,但是都是手机操作,不是很方便,所以想做抓取他的api用python直接传图片过去,然后再返回数据,用过charles找了半天也没找到api,心想是阿里的产品,那阿里云应该有这样的ocr服务才对,所以找了下,发现阿里有,腾讯有,就注册了阿里的,免费500次,一年时间,基本够了。(ps:阿里腾讯是不是应该给下广告费)。

传图片上去就可以转为json格式的数据返回,研究了半天没搞明白怎么写入Excel里面,后来找了个python包xlwt,按单元格位置直接写入Excel,很方便。

后续计划:

  1. 自己实现一个OCR模型,免费500次用完了其实花钱挺心疼;
  2. 弄个小程序,来给有需要的人使用。

代码:

## 使用阿里云的读光ocr来把图片表格转为Excel
## @suyin
## 2020-06-19


## 读光 高精版   还有个一般精度的,可以搜索
https://duguang.aliyun.com/document/%E9%AB%98%E7%B2%BE%E7%89%88.html

# {
# //图像数据:base64编码,要求base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,和url参数只能同时存在一个
# "img": "",
# //图像url地址:图片完整URL,URL长度不超过1024字节,URL对应的图片base64编码后大小不超过4M,最短边至少15px,最长边最大4096px,支持jpg/png/bmp格式,和img参数只能同时存在一个
# "url": "",
# //是否需要识别结果中每一行的置信度,默认不需要。 true:需要 false:不需要
# "prob": false,
# //是否需要单字识别功能,默认不需要。 true:需要 false:不需要
# "charInfo": false,
# //是否需要自动旋转功能,默认不需要。 true:需要 false:不需要
# "rotate": false,
# //是否需要表格识别功能,默认不需要。 true:需要 false:不需要
# "table": false,
# //字块返回顺序,false表示从左往右,从上到下的顺序,true表示从上到下,从左往右的顺序,默认false
# "sortPage": false
# }


import urllib.request
import urllib.parse
import json
import time
import base64


jpg_path = 'test_orc_20190619_v3'


with open(jpg_path + '.jpg', 'rb') as f:  # 以二进制读取本地图片
    data = f.read()
    encodestr = str(base64.b64encode(data),'utf-8')


#请求头
# 请修改为你自己的appcode,可从云市场订单或者api网关处获得
# 去注册了就在后台可以看到,把xxxxx改为你的appcode就好了
AppCode = "xxxxxx"
headers = {
    'Authorization': 'APPCODE ' + AppCode,
    'Content-Type': 'application/json; charset=UTF-8'
}


def posturl(url, data={}):
    try:
        params = json.dumps(dict).encode(encoding='UTF8')
        req = urllib.request.Request(url, params, headers)
        r = urllib.request.urlopen(req)
        html =r.read()
        r.close();
        return html.decode("utf8")
    except urllib.error.HTTPError as e:
        print(e.code)
        print(e.read().decode("utf8"))
    time.sleep(1)
    




url_request = "https://ocrapi-advanced.taobao.com/ocrservice/advanced"
dict = {'img': encodestr,
        'rotate': True,
        'table': True}


html = posturl(url_request, data=dict)
# print(html)

text = json.loads(html)
# text
# text['prism_tablesInfo']

# //表格中单元格id,和prism_wordsInfo信息中的tableCellId对应
# "tableCellId": 0,
# //单元格中的文字
# "word": ":2017",
# //xStartCell缩写,表示横轴方向该单元格起始在第几个单元格,第一个单元格值为0
# "xsc": 0,
# //xEndCell缩写,表示横轴方向该单元格结束在第几个单元格,第一个单元格值为0,如果xsc和xec都为0说明该文字在横轴方向占据了一个单元
#   格并且在第一个单元格内
# "xec": 0,
# //yStartCell缩写,表示纵轴方向该单元格起始在第几个单元格,第一个单元格值为0
# "ysc": 0,
# //yEndCell缩写,表示纵轴方向该单元格结束在第几个单元格,第一个单元格值为0
# "yec": 0,
# //单元格位置,按照单元格四个角的坐标顺时针排列,分别为左上XY坐标、右上XY坐标、右下XY坐标、左下XY坐标
# "pos": [
# {
#   "x": 107,
#   "y": 203
# },
# {
#   "x": 247,
#   "y": 203
# },
              
xCellSize = text['prism_tablesInfo'][0]['xCellSize']
yCellSize = text['prism_tablesInfo'][0]['yCellSize']
word = text['prism_tablesInfo'][0]['cellInfos'][0]['word']
xsc = text['prism_tablesInfo'][0]['cellInfos'][0]['xsc']
xec = text['prism_tablesInfo'][0]['cellInfos'][0]['xec']
ysc = text['prism_tablesInfo'][0]['cellInfos'][0]['ysc']
yec = text['prism_tablesInfo'][0]['cellInfos'][0]['yec']


print('xCellSize:', xCellSize)
print('yCellSize:', yCellSize)
print('word:', word)
print('xsc:', xsc)
print('xec:', xec)
print('ysc:', ysc)
print('yec:', yec)


# !pip install xlwt
# http://www.ityouknow.com/python/2019/12/29/python-excel-103.html


# workbook = xlwt.Workbook(encoding='utf-8')
# worksheet = workbook.add_sheet('sheet1')
# #通过worksheet调用merge()创建合并单元格
# #第一个和第二个参数单表行合并,第三个和第四个参数列合并,


# #合并第0列到第2列的单元格
# worksheet.write_merge(0, 0, 0, 2, 'first merge')


# #合并第1行第2行第一列的单元格
# worksheet.write_merge(0, 1, 0, 0, 'first merge')


# workbook.save('students.xls')




# 导入 xlwt 库
import xlwt


# 创建 xls 文件对象
wb = xlwt.Workbook()


# 新增两个表单页
sheet_name = 'test'
sh1 = wb.add_sheet(sheet_name,  cell_overwrite_ok=True)


# 数据写入Excel
# len(text['prism_tablesInfo'])
# 有多个table


prism_tablesInfo = text['prism_tablesInfo']
for table in prism_tablesInfo:
    cellInfos = table['cellInfos']


    for cell in cellInfos:
        word = cell['word']
        xsc = cell['xsc']
        xec = cell['xec']
        ysc = cell['ysc']
        yec = cell['yec']


        sh1.write(ysc, xsc, word)
#         sh1.write_merge(ysc, yec, xsc, xec, word)




    #     print('word:', word, '-xsc:', xsc, 'xec:', xec, 'ysc:', ysc, 'yec:', yec)




# 最后保存文件即可
save_file = 'ocr测试_20200619_V4'


wb.save(save_file + '.xls')

效果

转换前(手机电脑拍照)

9b4a2910c8452c875d21bd5f5b890df2.png

转换后(电脑截图)

6a9d1e753497d3c1eda6190c9cbef724.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值