整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python数据展示 - 生成表格图片

Python数据展示 - 生成表格图片

前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片。

选一个合适库

Python最大的优点就是第三方库丰富,基本你要什么功能,都能找到别人实现好的库,几行代码一调用就完事了。

Pytable

项目地址:https://github.com/HiroshiARAKI/pytable

最先找到的是日本人开发的pytab库,它是基于matplotlib来画图的,默认参数下生成的表格外观一般般,而且显示不了中文字符,字体也很小,效果不理想。

我一开始还抱着死磕的心态,把这个库的源码下载下来魔改,改了字体和大小,生成的表格终于能看了,但排版还是会出各种奇奇怪怪的问题,比如文字溢出单元格之类的,心累……

Plotly

官网地址:https://plotly.com/

后面找到了一个新的库:plotly,官网的介绍是:

The front end for ML and data science models

专门为机器学习和数据科学设计的前端展示工具,单纯拿来画表格还算大材小用了~ 它是用网页来渲染的,看例子效果还可以,我就换成这个plotly试试,嗯,真的可以,那就这个了。

本文会分别介绍这两个库的使用,包括我魔改了pytab的地方。

(不过还是推荐plotly,网页渲染就是好)

pytab

首先安装

pip install pytab

然后我把画表格的代码封装成一个函数

import uuid
from typing import List, Dict, Optional, Tuple

import pytab

def draw_table(data: Dict[str, list]):
    """
    画表格

    :param data: 数据格式 {
        'a': [1.0, 2.1, 3.5, 4.0, 2.0, 1.0, 2.1, 3.5, 4.0, 2.0, ],
        'b': [5.7, 6.1, 7.2, 8.3, 1.2, 5.7, 6.1, 7.2, 8.3, 1.2, ],
        }
    :return:
    """
    # 设置字体,不然显示不了中文
    pytab.plt.rcParams["font.sans-serif"]=["SimHei"]
    pytab.table( 
        data=data,
        data_loc='center',
        # th_type='dark',
        th_c='#aaaaee',  # 设置表头背景颜色
        td_c='gray',  # 设置数据行背景颜色
        table_type='striped',
        figsize=(len(data.keys()), int(len(data.values()) / len(data.keys()) + 1)),
        # fontsize=18,
    )

    # pytab.show()
    temp_file=os.path.join(tempfile.gettempdir(), f'{uuid.uuid4().hex}.jpg')
    print(temp_file)
    pytab.save(temp_file)
    return temp_file

按照注释的这个数据格式,a和b是表头列名,后面的数组是每一列的数据,很好理解

{
    'a': [1.0, 2.1, 3.5, 4.0, 2.0, 1.0, 2.1, 3.5, 4.0, 2.0, ],
    'b': [5.7, 6.1, 7.2, 8.3, 1.2, 5.7, 6.1, 7.2, 8.3, 1.2, ],
}

画出来的表格是这样的

再来试试中文显示会怎么样

{
    '列1': [1.0, 2.1, 3.5, 4.0, 2.0, 1.0, 2.1, 3.5, 4.0, 2.0, ],
    '列2': [5.7, 6.1, 7.2, 8.3, 1.2, 5.7, 6.1, 7.2, 8.3, 1.2, ],
}

画出来是这样

有点丑吧,勉强能看

OK~ 关于pytab的就不多折腾了,毕竟上限就在这了

接下来看看plotly

plotly

首先安装

pip install plotly

话不多说,老规矩,我又是写成一个函数

import uuid
from typing import List, Dict, Optional, Tuple

import plotly.graph_objects as go
import plotly.io as pio

def draw_table(headers: List[str], cells: List[list]):
    """
    画表

    :param headers: header=dict(values=['A Scores', 'B Scores'])
    :param cells: cells=dict(values=[[100, 90, 80, 90], [95, 85, 75, 95]])
    :return:
    """
    pio.kaleido.scope.default_width=len(','.join(headers)) * 20
    pio.kaleido.scope.default_height=250 + len(cells[0]) * 20
    fig=go.Figure(data=[go.Table(header=dict(values=headers), cells=dict(values=cells))])
    # fig.show()
    image_file=os.path.join(tempfile.gettempdir(), f'{uuid.uuid4().hex}.jpg')
    print('write image to', image_file)
    fig.write_image(image_file)
    return image_file

这次的参数格式更前面的pytab不一样,要传两个参数,都是数组类型

第一个是表头,第二个数组是单元格

先来个例子试试

draw_table(['列A', '列B'], [[100, 90, 80, 90], [95, 85, 75, 95]])

然后把上面函数代码里的fig.show()注释去掉,可以看到生成的表格图片效果

运行后可以发现自动打开了浏览器,因为这个库是使用网页来渲染表格的,效果如下

效果比前面那个pytab好一些,哈哈~

文章来自https://www.cnblogs.com/deali/p/16122021.html

们都知道,Word中的表格是一个非常有用的工具,可以让我们在文档中轻松添加和编辑各种数据。但有时候我们可能会遇到一个问题:当表格作为图片插入时,我们就不能直接编辑它了。这可怎么办呢?

别担心,我们有两种方法来解决这个问题。第一种是手动重新创建表格,第二种是使用OCR工具。让我们来看看这两种方法的具体步骤。

第一种方法:手动重新创建表格

首先,我们需要将图片作为参考,利用Word中的表格插入工具手工创建一个新表格。然后,通过键入的方式输入图片中的文字内容。这个方法需要一定的时间和耐心,但对于不太复杂的表格来说,应该还是比较容易的。

第二种方法:使用OCR工具

OCR是Optical Character Recognition的缩写,即光学字符识别,是一种将图像中的文字转换为可编辑文本的技术。我们可以使用OCR工具来将图片中的表格转换为可编辑的格式。下面以金鸣表格文字识别大师为例,介绍具体步骤:

1. 将Word文件另存为HTML格式,这样Word中的图片就会自动保存在一个单独的、与HTML文件同名的文件夹中。

2. 打开金鸣表格文字识别大师,将上一步保存的图片的文件夹拖入到软件的图片列表中,也可以直接将word文档拖入进去,它会自动转为图片,当然,您也可以像上图那样直接添加进去。

3. 选择表格识别模式,输出格式选择Word。

4. 点击提交识别按钮,等待识别完成。

5. 识别完成后,我们就可以得到一份可编辑的Word文档了。在这个文档中,我们可以自由地编辑表格里面的内容。

以上就是两种将图片中的表格转换为可编辑格式的方法。虽然手动重新创建表格需要较多时间和劳动力,但如果表格比较简单,这个方法还是不错的选择。而使用OCR工具则会更加快捷方便,尤其适合处理大量图片中的表格。无论您选择哪种方法,都能够让表格变得更加灵活、易于编辑,提高工作效率。

#表格#

经常在一些报告业务场景,客户常常要求可以实现导出html、pdf、xmind格式的报告文件,生成pdf格式文件,网络上有很多开源的解决方案,但是生成html格式开源免费的解决方案很少,下面我给我大家介绍一下,如何解决这些问题

pdf

  • iText,生成PDF文档,还支持将XML、Html文件转化为PDF文件;
  • Apache PDFBox,生成、合并PDF文档;
  • docx4j,生成docx、pptx、xlsx文档,支持转换为PDF格式。

这些框架都支持,这里不再详细介绍,具体用户可以在github上,进行查阅

html

可以用一些收费的框架,可以做到,比如Aspose,但是在这里介绍一个思路,去解决这个问题,大家肯定对导出excel表格很熟悉把,填充数据与表格,然后还可以设置标头样式与单元格样式,那么我们可以按照这个思路,进行开发一个简易版本的导出html文件。

  • 代码逻辑
@Test
    void listToHtmlTableTest() throws IOException {
        List<String> headers=List.of("Name", "Age", "City");
        List<List<String>> data=List.of(
                List.of("gz", "25", "beijing"),
                List.of("jelly", "30", "he ze")
        );
        //头样式
        String headStyle="border: 1px solid #000000;";
        //表格样式
        String bodyStyle="border: 1px solid #000000;";
        //转成html标签
        String htmlTable=HtmlTable.convertDataToHtml(headers, data,headStyle,bodyStyle);
        //输出html文件
        String fileName="output.html";
        try (BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(fileName))) {
            bufferedWriter.write(htmlTable);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

 public static String convertDataToHtml(List<String> headers, List<List<String>> data,String headStyle,String bodyStyle) {
        StringBuilder html=new StringBuilder();
        html.append("<table>");
        // table headers
        html.append("<thead><tr>");
        for (String header : headers) {
            html.append("<th style=\"").append(headStyle).append("\">").append(header).append("</th>");
        }
        html.append("</tr></thead>");

        // table body
        html.append("<tbody>");
        for (List<String> row : data) {
            html.append("<tr>");
            for (String cell : row) {
                html.append("<td style=\"").append(bodyStyle).append("\">").append(cell).append("</td>");
            }
            html.append("</tr>");
        }
        html.append("</tbody>");
        html.append("</table>");
        return html.toString();
    }代码运行效果
  • 代码运行效果

  • 优化点

可配置样式

导出封装

支持图片

支持模板导出

xmind

开源sdk:https://github.com/xmindltd/xmind-sdk-js

需要前端实现,因为官方没有提供java版本sdk

每天不断更,精彩不停止,明天见,我是行者

记得留个关注、点赞、评论哟,让我们一起去看星辰大海,品味代码人生