精华内容
下载资源
问答
  • 最近,我写公司项目word导出功能,应该只有2小时的工作量,却被硬生生的拉长2天,项目上线到业务正常运行也被拉长到2个星期。为什么如此浪费时间呢? 1)公司的项目比较老,采用硬编码模式,...表格长度需要人工计算...

    最近,我写公司项目word导出功能,应该只有2小时的工作量,却被硬生生的拉长2天,项目上线到业务正常运行也被拉长到2个星期。

    为什么如此浪费时间呢?

        1)公司的项目比较老,采用硬编码模式,意味着word改一个字就要发布一次代码。发布检验就浪时间了。

        2)由于硬编码,采用的是这种格式,手写代码比较废时,而且编写表格时会遇到单元格字数变多被撑大,表格变形的情况。表格长度需要人工计算。这类意想不到的问题。

        3)公司测试库数据不全,测试库数据无法全面覆盖线上环境。这又拉长了检验时间。

        4)项目分支被正在开发的分支合并了,一下子被拉长了4天。

    这简单功能浪费太多时间了,我在网上搜了一下word导出的方案:

        第一种:硬编码,就是公司的方案,问题太多了不用考虑。

        第二种:通过Sql查询数据,存入字典,再通过第三方组件替换word的文字。这种方案,简单容操作,sql查询可以换成存储过程,也存在缺点,1)存储过程要写提很细,逻辑算法都写在存储过程,存储过程可能变得很复杂。2)不支持表格内插入多条数据。

        第三种:通过Sql查询数据,使用Razor模板引擎生成word。这种方案解决了存储过程复杂问题,但Razor模板内使用这种格式,所以写模板时很麻烦。

        第四种:通过Sql查询数据,存入字典,再通过第三方组件替换word的域。这种方案与第二种方案类似,对我个人来说,我不喜欢修改域。

    但是,我想要一个简单、容易控制、表格内能插入多条数据、可商用的方案。

        简单:类似第二种方案,数据存入字典,循环替换word的文字,存储过程可以写得简单。

        容易控制:模板不能使用这种格式,最好能用office直接控制表格文字大小、颜色。

        表格内能插入多条数据:我写的组件内必须有索引。

        可商用:拒绝商用组件。

    经过几天琢磨,我找到可行的方案:存储过程+模板+算法可控

    依赖组件:

        DocumentFormat.OpenXml,微软官方开源组件,支持docx文件,MIT协议。

        ToolGood.Algorithm,本人的Excel计算引擎组件,MIT协议,可简化存储过程。

    核心代码:

        ReplaceTemplate 替换Word文字

        ReplaceTable 替换Word表格并支持插入

    ReplaceTemplate 替换Word文字

    public class WordTemplate : AlgorithmEngine    {        private readonly static Regex _tempEngine = new Regex("^###([^::]*)[::](.*)$");// 定义临时变量        private readonly static Regex _tempMatch = new Regex("(#[^#]+#)");//         private readonly static Regex _simplifyMatch = new Regex(@"(\{[^\{\}]*\})");//简化文本 只读取字段        private void ReplaceTemplate(Body body)        {                        var tempMatches = new List<string>();            List deleteParagraph = new List();            foreach (var paragraph in body.Descendants()) {                var text = paragraph.InnerText.Trim();                var m = _tempEngine.Match(text);                if (m.Success) {                    var name = m.Groups[1].Value.Trim();                    var engine = m.Groups[2].Value.Trim();                    var value = this.TryEvaluate(engine, "");                    this.AddParameter(name, value);                    deleteParagraph.Add(paragraph);                    continue;                }                var m2 = _tempMatch.Match(text);                if (m2.Success) {                    tempMatches.Add(m2.Groups[1].Value);                    continue;                }                var m3 = _simplifyMatch.Match(text);                if (m3.Success) {                    tempMatches.Add(m3.Groups[1].Value);                    continue;                }            }            foreach (var paragraph in deleteParagraph) {                paragraph.Remove();            }            Regex nameReg = new Regex(string.Join("|", listNames));            foreach (var m in tempMatches) {                string value;                if (m.StartsWith("#")) {                    var eval = m.Trim('#');                    ……                    value = this.TryEvaluate(eval, "");                } else {                    value = this.TryEvaluate(m.Replace("{", "[").Replace("}", "]"), "");                }                foreach (var paragraph in body.Descendants()) {                    ReplaceText(paragraph, m, value);                }            }        }// 代码来源 https://stackoverflow.com/questions/19094388/openxml-replace-text-in-all-document        private void ReplaceText(Paragraph paragraph, string find, string replaceWith){    ….}}

    ReplaceTable 替换Word表格并支持插入

    private readonly static Regex _rowMatch = new Regex(@"({{(.*?)}})");//        private int _idx;        private List<string> listNames = new List<string>();        private void ReplaceTable(Body body)        {            foreach (Table table in body.Descendants
    ()) { foreach (TableRow row in table.Descendants()) { bool isRowData = false; foreach (var paragraph in row.Descendants()) { var text = paragraph.InnerText.Trim(); if (_rowMatch.IsMatch(text)) { isRowData = true; break; } } if (isRowData) { // 防止 list[i].Id 写成 [list][[i]].Id 这种繁杂的方式 Regex nameReg = new Regex(string.Join("|", listNames)); Dictionary<string, string> tempMatches = new Dictionary<string, string>(); foreach (Paragraph ph in row.Descendants()) { var m2 = _rowMatch.Match(ph.InnerText.Trim()); if (m2.Success) { var txt = m2.Groups[1].Value; var eval = txt.Substring(2, txt.Length - 4).Trim(); eval = nameReg.Replace(eval, new MatchEvaluator((k) => { return "[" + k.Value + "]"; })); tempMatches[txt] = eval; } } TableRow tpl = row.CloneNode(true) as TableRow; TableRow lastRow = row; TableRow opRow = row; var startIndex = UseExcelIndex ? 1 : 0; _idx = startIndex; while (true) { if (_idx > startIndex) { opRow = tpl.CloneNode(true) as TableRow; } bool isMatch = true; foreach (var m in tempMatches) { string value = this.TryEvaluate(m.Value, null); if (value == null) { isMatch = false; break; } foreach (var ph in opRow.Descendants()) { ReplaceText(ph, m.Key, value); } } if (isMatch==false) { //当数据为空时,清空数据 if (_idx == startIndex) { foreach (var ph in opRow.Descendants()) { ph.RemoveAllChildren(); } } break; } if (_idx > startIndex) { table.InsertAfter(opRow, lastRow); } lastRow = opRow; _idx++; } } } } }

    案例上手:

    后台代码:

    // 获取数据            var helper = SqlHelperFactory.OpenSqliteFile("test.db");        .......            var dt = helper.ExecuteDataTable("select * from Introduction");            var tableTests = helper.Select("select * from TableTest");            ToolGood.OutputWord.WordTemplate openXmlTemplate = new ToolGood.OutputWord.WordTemplate();            // 加载数据            openXmlTemplate.SetData(dt);            openXmlTemplate.SetListData("list", JsonConvert.SerializeObject(tableTests));            // 生成模板 一            openXmlTemplate.BuildTemplate("test.docx", "openxml_2.docx");            // 生成模板 二            var bs = openXmlTemplate.BuildTemplate("test.docx");            File.WriteAllBytes("openxml_1.docx", bs);

    Word模板:

    3e74ca7db75b69737e9910c8ee521e4a.png

    Word生成后:

    675ea142744b01e60cccc5bbe0fefbb8.png

     后记:

    WordTemplate 类,主要实现了三个功能:

        1、自定义替换word中的文字标签,当标签不存在,则设置为空字符串;

        2、可以有word中定义公式,替换所对应的值;

        3、在表格插入多行数据,当数据为0时清空单元格。

    通过上面三个功能,WordTemplate 类将代码中的word生成方法分离出来。

    系统后台需要配置 存储过程与word模板信息,就可以将word生成与系统更新完成分离开了。

    系统后台可以配置公式,则公式修改不需要更新word模板。

    注:一般业务人员是看得懂四则运算的,部分财务人员更是了解Excel公式,可以减少开发协助时间。

    完整代码:https://github.com/toolgood/ToolGood.OutputWord

    该组件已上传到Nuget:Install-Package ToolGood.OutputWord

    Excel公式参考:https://github.com/toolgood/ToolGood.Algorithm

    展开全文
  • word文档设置表格列宽的方法如下:1、打开设置表格的文档。2、选中表格。3、点击菜单栏上的布局选项卡。4、在宽度进行设置,或者自动调整表格即可。Microsoft Word是微软公司的一个文字处理器应用程序。它最初是由...

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。

    word文档设置表格列宽的方法如下:

    1、打开设置表格的文档。

    2、选中表格。

    3、点击菜单栏上的布局选项卡。

    4、在宽度进行设置,或者自动调整表格即可。

    Microsoft Word是微软公司的一个文字处理器应用程序。它最初是由Richard Brodie为了运行DOS的IBM计算机而在1983年编写的。随后的版本可运行于Apple Macintosh (1984年),SCO UNIX,和Microsoft Windows (1989年),并成为了Microsoft Office的一部分。为 Xerox PARC开发的GUI文本编辑器Bravo当中的许多概念和想法被带进了Microsoft Word。Bravo的创始人Charles Simonyi离开PARC后于1981年进入微软公司。当年和他一起开发Bravo的Simonyi雇佣了Brodie,于是他在当年夏天离开了PARC。为MS-DOS计算机开发的Word的第一代于1983年底发行,但是反响并不好,销售落后于WordPerfect等对手产品。尽管如此,在Macintosh系统中,Word在1985年发布以后赢得了广泛的接受,尤其是对于在两年以后第二次大型发布的Word 3.01 for Macintosh。和其他Mac软件一样,Word for Mac是一个真正的(所见即所得)编辑器。

    展开全文
  • Java如何制作带表格word文档

    千次阅读 2020-08-05 17:44:10
    设置和添加表格有关操作 ...表格计算行列时,全部和我们平时使用一样,从1开始 创建表格 new WordTable(int row, int column) new WordTable(int row, int column, String css) 创建一个 row 行,column 列的表

    设置和添加表格有关操作

    写在最前

    首先您需要导入WordGo的jar包或者写上maven仓库的坐标,最新版直接去git下载就好:https://github.com/qrpcode/wordgo

    表格计算行列时,全部和我们平时使用一样,从1开始

    创建表格

    new WordTable(int row, int column)

    new WordTable(int row, int column, String css)

    创建一个 row 行,column 列的表格,支持在创建的时候设置css样式

    这里css支持直接指定模板,省时省力!详见下方 template 属性

    合并单元格

    merge(int rowLeftTop, int columnLeftTop, int rowRightBottom, int columnRightBottom)

    rowLeftTop、columnLeftTop 分别为合并区域的左上单元格行和列;rowRightBottom、columnRightBottom分别为合并区域的右下单元格行和列。

    合并成功返回true,失败返回false。

    合并后会将所有被合并单元格内容拼接。

    代码示例:

    WordTable wordTable = new WordTable(5, 6, "column-width:1=50%; template: normal2; width:50%");
    wordTable.merge(2, 4, 4 ,5);
    

    成功和失败示例:

    单元格合并

    填充数据

    添加文本

    add(int row, int column, String ... str)

    从 row 行column列开始向左填充数据。

    如果遇到合并单元格且是左上角单元格才会填充(详见示例)

    示例1(左):wordTable.add(2, 1, "aa", "bb", "cc")

    示例2(右):wordTable.add(3, 1, "aa", "bb", "cc")

    合并左上用

    添加图片

    addImg(int row, int column, String uri, String css)

    在 row 行column列中插入一个绝对地址为uri的图片,样式表为css(css样式可用范围和正常插入图片一样)。成功返回true,失败返回false。

    添加独特样式的文本

    addStyleText(int row, int column, String text, String css)

    在 row 行column列中插入 text 文字,样式表为css(css样式可用范围和正常插入文字一样)。成功返回true,失败返回false。

    设置部分单元格样式

    设定某一个:addStyle(int row, int column, String css)

    设定一些:addStyle(int rowLeftTop, int columnLeftTop, int rowRightBottom, int columnRightBottom, String css)

    设定一些的前四个参数和合并单元格同理,是左上和右下单元格的行和列值,css为样式表文本。

    添加表格到word

    wordGo中有两个方法都可以添加表格,底层实现没区别,用哪个看习惯即可

    add(WordTable)addTable(wordTable)

    WordGo wordGo = new WordGo();
    wordGo.add("Hello", "font-size: 20");
    //...
    WordTable wordTable = new WordTable(5, 6, "column-width:1=50%; template: normal2; width:50%");
    //创建一个表格
    wordTable.merge(2, 4, 4 ,5);
    //合并表格
    wordTable.add(2, 3, "aaa", "bbb", "ccc");
    //填充数据
    wordGo.add(wordTable);
    //添加到word中
    //...
    wordGo.create("C:\\demo.docx");
    

    支持样式

    图片和文字样式和正常使用一样,这里仅介绍表格样式支持的样式

    template 表格模板

    表格模板和MSoffice一样,下面是名称和对应样式对照关系,此模板支持WPS等打开浏览。

    示例:template:normal3

    表格列表

    详细样式是什么样子可以在Microsoft Word查看:

    表格样式

    width 表格宽度

    支持百分比,也支持磅值。百分比必须写%,写pt、px或单独一个数字都会被解析为磅值

    示例:width:50% width:300pt

    text-align 对齐方式

    和文字一样,left、center、right三个取值,推荐center,默认left

    示例:text-align:center text-align:left

    column-width 列宽

    需要指定哪一列多宽,支持百分比或磅值。百分比需带%,纯数字或者px、pt结尾都会被解析为磅值

    column-width:1=50%,3=20%

    如上,用“ , ” 分割不同列,写法是列号 = 宽度

    其他未指定的列将会自动平分宽度。

    【重要】即使指定了宽度,如果在格子中插入了图片,桌面版office软件一般都还会自动调整,插入图片后,可能设置的值和实际仍有偏差。石墨文档等在线工具导入一般不会进行调整。

    row-height 行高(不推荐使用)

    【重要】使用此属性可能导致文字因为高度太小显示不全!默认为自动调整,建议保持默认。

    示例:row-height:1=50pt,3=20%

    使用方法同 column-width

    展开全文
  • 乙类人员考核评分计算表(Word表格)对我们有很大的帮助,日常工作生活我们可能都会用到,需要乙类...该文档为乙类人员考核评分计算表(Word表格),是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 大家看下面这张图,在表格中列出了一周货品销售统计数据,并利用Word表格工具中的公式功能对销售额和利润进行了计算Word表格数据计算请移步:Word表格中的数据处理技巧。现在想在第二部分“数据分析”中动态的引用...

    0fe097fbab9e36c8be7bbb57674679e8.png

    大家好!

    今天和大家分享一个关于书签应用的案例。

    大家看下面这张图,在表格中列出了一周货品销售统计数据,并利用Word表格工具中的公式功能对销售额和利润进行了计算。Word表格数据计算请移步:Word表格中的数据处理技巧。

    d864de1a40c0d7a383d570a26408e434.png

    现在想在第二部分“数据分析”中动态的引用销售额和利润两个数据,可以实现么?

    有朋友可能会说,这简单呀,使用Word域,输入{= D8 }(注意:红色字体部分中的花括号是按【Ctrl+F9】输入的),因为在Word表格中输入函数公式求值时可以像在Excel中一样使用类似D8这样的方式来表示单元格。

    可是,经测试发现,这样操作Word域返回的值是0!!!

    e5787eb2516501efd4a28dd6f07ec834.png

    这说明,在表格外,使用D8这种单元格表达方式是不行的。

    那怎么办?

    现在祭出我们今天的法宝——书签!

    这里以引用销售额数据为例进行操作。

    第1步,创建一个书签。

    方法是:选中汇总行的销售额数据,然后单击【插入】选项卡中的【书签】命令,在【书签】对话框中输入书签名字“销售额”,再单击【添加】命令。

    c629016c133f37b9d0f8ebb0a7df91a9.png

    第2步,在Word域代码中引用书签。

    操作方法是:

    在文档第2部分需要引用数据的位置按【Ctlr+F9】输入一对花括号(必须!),然后输入以下代码,效果如下图。

    c60a495be2f7e3386d7dff213c92581a.png

    第3步,切换到结果状态,【F9】刷新。

    在刚才录入的代码上单击鼠标右键,选择【切换域代码】命令,如果结果显示不正确的话,选中该Word域后,按【F9】刷新即可。如果表格数据修改了,只要全选全文,按一次【F9】刷新Word域,引用数据就会自动实现更新,怎么样?帅吧?

    好了,来看看刚才的劳动成果吧!

    397cba61e30570c97021aa34f7fb8003.png

    这次,给大家附一个操作过程的讲解视频吧!

    a38170442e72ba85ec9f5383453c737a.png

    今天就分享就到这里,快来点赞转发吧!

    推荐阅读:

    Word视图模式知多少

    这些细节会帮助你成为Word高手!

    Word表格中的数据处理技巧

    制作折纸式环保桌牌

    Word达人带你玩转制表位!

    欢迎朋友们分享办公技巧,邮箱:wordjqdr@126.com

    382c00b09bdfb17b47c891f33f1df64f.png

    想要学习更多Word排版技巧,单击【

    展开全文
  • 目标最近实验室里成立了一个计算机兴趣小组倡议大家多把自己解决问题的经验记录并分享就像在...我用python”所以决定用python从docx文档中提取文件头的信息然后把信息更新到一个xls电子表格中,像下面这样(直接po...
  • 然后把信息更新到一个xls电子表格中,像下面这样(直接po结果好了) 而且点击文件路径可以直接打开对应的文件(含超链接) 代码实现 1. 采集docx里面文件头信息 # -*- coding:utf-8 -*- # 此程序可扫描
  • word中,域简单来说是一切可以更新的东西,域尽管只有一个字,但是却像excel中的宏一样变化莫测,难以琢磨,word中的域有插入页码、时间日期、进行表格计算等70多种功能,今天就给大家介绍关于使用域进行表格计算...
  • 用python批量读取word文档并整理关键信息到excel表格

    万次阅读 多人点赞 2018-06-02 08:20:57
    目标最近实验室里成立了一个计算机兴趣小组倡议大家多把自己解决问题的经验记录并分享就像在...我用python”所以决定用python从docx文档中提取文件头的信息然后把信息更新到一个xls电子表格中,像下面这样(直接po...
  • Word文档与Excel文档的安全问题 关于Word与excel文档我们都知道它们分别是文字处理软件和电子表格软件;前者善于对数据进行简单的计算,后者擅长存储、计算和分析数据;大部分的人都接触过它们;在这里介绍一下Word...
  • 作为上班族来说,天天都要与数字打交道,很多人都知道利用Excel技巧在Excel表格中进行计算是很方便,也很简单的,那万一遇到的是Word文档了,你还会运算吗?1.添加计算功能键点击菜单栏上方的【自定义快速访问工具栏...
  • Word文档中的表格也可以进行数据运算的。例如,要对表格中第1季度的数据进行求和计算时,具体操作方法如下。1第1步:将光标置于要输入合计值的单元格中,切换到【表格工具】栏中的【布局】选项卡中,在【数据】组中...
  • word中,域简单来说是一切可以更新的东西,域尽管只有一个字,但是却像excel中的宏一样变化莫测,难以琢磨,word中的域有插入页码、时间日期、进行表格计算等70多种功能,今天就给大家介绍关于使用域进行表格计算...
  • 昨天小编的PPT干货和小伙伴们分享完成之后,不少小伙伴们在后台留言询问Word文档和Excel表格的通关秘籍,今天,小编就和大家来分享Word文档的常考考点和注意事项。第1条:行距喜欢考多倍行距;第2条:项目符号如果是...
  • 目标最近实验室里成立了一个计算机兴趣小组倡议大家多把自己解决问题的经验记录并分享就像在...我用python”所以决定用python从docx文档中提取文件头的信息然后把信息更新到一个xls电子表格中,像下面这样(直接po...
  • 近期工作需要,需将一些计算结果导出为excel、word格式的文档,结果为一个稍复杂的二维表格。参考网上诸多前辈的博客,现将方法记录如下,参考链接会放至文末。 首先是生成word文档,需要有个模板,例: ...
  • 无论是创建电子表格,演示文稿,电子邮件还是文档,您都需要软件来执行所需的任何活动。Microsoft Word用于创建文档或您需要存储文本的任何内容。如果您购买了最新版本,则Microsoft Office有几个生产力工具可以安装...
  • 录入上图文字内容,并按如下要求设置后,所有内容显示在同一张页面中。要求如下:1.根据参考样式,插入艺术字“全国计算机等级考试报告会”,设置为一号字,页面顶端...4.利用WORD表格功能制作表格,设置行高1厘米...
  • 回答:以Word2003为例介绍如下:首先确定表格的行数和列数。如表格为5行6列,则想设置一个长150mm宽120mm的表格计算表格每行高度为15/5=3(cm),每列宽度为12/6=2(cm)。第一步:点击工具栏中“表格”按钮,鼠标...
  • 在制作一份报告或者一篇文档,经常因为一个软件的硬伤,折腾半天。如果对插入的表格数据不进行分类,表格在跨页后,没有相关...WORD中插入的表格跨页后,如何为下一页的表格自动添加标题?比如下边这张税金计算表:...
  • 扒一扒word文档

    2019-04-15 14:32:30
    常见但不是很清楚的操作 1.题注 图表命名编号必备:选中图片/表格,右键->插入题注,可以自行更改标签。 ...一般有表格法和制表位法。个人习惯使用制表位法,需要简单计算。 https://blog.csdn.net/...
  • 在我们处理数据的时候,已经习惯了用excel表格进行处理数据,然后再把结果复制到word文档中进行编辑,但是一旦某些数据需要更新时,又要重新在excel中计算弄好再复制到word文档中,费时又耗力。那有的人不禁会想,可...
  • 无论是创建电子表格,演示文稿,电子邮件还是文档,您都需要软件来执行所需的任何活动。Microsoft Word用于创建文档或您需要存储文本的任何内容。如果您购买了最新版本,则Microsoft Office有几个生产力工具可以安装...
  • 这是一个计算Word中文档行数的例程(表格中的行数不算)。 Sub test() Dim i As Integer Dim t As Table i = ActiveDocument.range.ComputeStatistics(wdStatisticLines) For Each t In ActiveDocument...
  • WORD部分的考试大纲1.Microsoft Office应用界面...4. 文档表格的制作与编辑。5. 文档中图形、图像(片)对象的编辑和处理,文本框和文档部件的使用,符号与数学公式的输入与编辑。6. 文档的分栏、分页和分...
  • 问题发生的原因:在读取文档的时候,计算的是当前的总页数,如果后续追加了内容,计算的值也不会发生改变,比如,我读取doc文档的时候,总页数是1页,后续又用了代码追加了表格一类的东西,导致word变成了多页,那么...
  • word中的公式,自动计算

    千次阅读 2014-05-27 01:54:27
    word中可以和excel一样使用公式进行自动计算,可以在文档任何位置插入自动计算的表达式,插入方法:菜单——表格——公式。表达式的写法与excel中一样,同样以“=”开头,可以任意使用常数和“+”“-”“*”“/”四...
  • 最近工作较忙,辅导员要求写助学金评定表,结果拖到最后一天晚上才赶紧填写表格,写完之后就准备发送给老师了。可是再打开一次核对的时候竟然打不开了。出现:“Microsoft Office Word已停止工作”。如下图 ...
  •  单击Powerpoint“插入”菜单中的“对象”号召,敞开“插入对象”对话框,抉择“Microsoft Word文档”,单击“确定”按钮,此刻在幻灯片中揭示了一个Word编辑框,菜单栏中也揭示了“表格”菜单,接下来就能够像在...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 231
精华内容 92
关键字:

word文档表格计算