最近的项目上写了一个公用的API,很久以前就用EXCEL发布过报表,但从没想过写API来简化。。。

其实方法很简单,就是自已用EXCEL做个模板,然后另存为XML 电子表格,用TEXT工具打开后,看一下XML 代码就明白了。这个程序无非就是用请求的输出来打印这个XML代码而已.
主要功能:
1. 支持数据格式包括字符型,数值型,日期型
2. 支持单元格样式(这个写的比较不灵活,如果有新增样式,需要在sheet_start里增加
3. 支持公式及数组公式
4. 支持自动换行(在样式里)
5. 支持单元格合并(左右合并及上下合并)
6. 支持水平方向定位(INDEX)
注意:
在注册请求时,输出方式需定义为XML。请求执行完毕后,点输出,然后选择EXCEL打开即可
CREATE OR REPLACE PACKAGE BODY cux_common_report_util_pkg IS
--*************************************************************************************
--*              Copyright (c) XXXXXXXX, 2012
--*                     All Rights Reserved
--*************************************************************************************
--** SYSTEM:                   EBS R12
--** PROGRAM NAME:             cux_common_report_util_pkg.pls
--** AUTHOR/EMAIL_ID:          Tony Liu
--** DATE CREATED:             2013-1-13
--** LATEST DATE MODIFIED:     2013-1-13
--**
--** DESCRIPTION:              用于发布输出格式为EXCEL的报表公用工具包
--**
--** INPUTS:
--**
--** OUTPUTS:                  N/A
--**
--** FUNCTION(S) CALLED:       N/A
--**
--** CAUTIONS:
--**
--**************************************************************************************
--** Revision History
--**   Date                   Revision Number        By         Reason/Defect
--**-----------------------------------------------------------------------------
--** 2013-1-13               1.0                     Tony Liu      Initial Version
--**************************************************************************************
--******************************************************************************
-- Procedure: 输出信息到请求输出(OUTPUT)中
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE line(p_text IN VARCHAR2) IS
BEGIN
fnd_file.put_line(fnd_file.output, p_text);
--dbms_output.put_line(p_text);
END;
--******************************************************************************
-- Procedure: 输出XML文件的头部信息
-- 版本: 1.0
-- Author: 刘峰
-- 说明:  author 传入提交请求的员工全名
--        creation_date 格式为 to_char(sysdate,'yyyy-mm-ddhh24:mi:ss')
--        company_name 传入xxxxxxx
--******************************************************************************
PROCEDURE sheet_start(p_author        IN VARCHAR2,
p_report_name   IN VARCHAR2,
p_creation_date IN VARCHAR2 DEFAULT to_char(SYSDATE,
'yyyy-mm-dd hh24:mi:ss'),
p_company_name  IN VARCHAR2 DEFAULT 'XXXXXX') IS
v_common_info1 VARCHAR2(32767);
v_common_info2 VARCHAR2(32767);
v_sheet_name   VARCHAR2(500);
v_date         VARCHAR2(20);
v_time         VARCHAR2(20);
TYPE t_style_tbl IS TABLE OF VARCHAR2(32767) INDEX BY BINARY_INTEGER;
v_style_tbl t_style_tbl;
BEGIN
v_date := substr(p_creation_date, 1, 10);
v_time := substr(p_creation_date, 12);
--XML 头信息
v_common_info1 := '<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
' || p_author ||
'
' || p_author ||
'
' || v_date || 'T' ||
v_time || 'Z
' || p_company_name ||
'';
v_common_info2 := '14.00
11250
21420
120
15
False
False
';
--工作表缺省样式
v_style_tbl(1) := '
//此为模板的默认style
';
--参数使用的样式
v_style_tbl(2) := '
//此为参数的默认style
';
--报表标题的样式(自动换行)
v_style_tbl(3) := '
//此为报表标题的默认style
';
--列标题的样式(自动换行)
v_style_tbl(4) := '
//此为报表列标题的默认style
';
--普通日期样式
v_style_tbl(5) := '
//此为日期型字段的默认style
';
--高亮日期样式
v_style_tbl(6) := '
//此为日期型字段的带背景色的style(黄色加强显示)
';
--普通会计数值样式
v_style_tbl(7) := '
//此为会计用数值型字段的默认style
';
--高亮会计数值样式
v_style_tbl(8) := '
//此为会计用数值型字段的带背景色的style(黄色加强显示)
';
--常规样式(自动换行)
v_style_tbl(9) := '
//此为普通字段的style
';
--常规高亮样式(自动换行)
v_style_tbl(10) := '
//此为普通字段的的带背景色的style(黄色加强显示)
';
--会计(4位小数)样式
v_style_tbl(11) := '
//此为会计用数值型字段的默认style(保留4位小数)
';
--会计(4位小数)高亮样式
v_style_tbl(12) := '
//此为会计用数值型字段的带背景色的style(保留4位小数,黄色加强显示)
';
--会计样式(两位小数,负数加括号,0显示为'-')
--样式:999,999,999.00 每三位一个分隔符999,999,999.00,负数用空号包住(123),如果是零 则是' - '
v_style_tbl(13) := '                        
';
--会计样式(两位小数,负数加括号,0显示为'-', 并用黄色加亮)
--样式:999,999,999.00 每三位一个分隔符999,999,999.00,负数用空号包住(123),如果是零 则是' - '
v_style_tbl(14) := '                        
';
--定义工作表名称
IF p_report_name IS NULL THEN
v_sheet_name := '';
ELSE
v_sheet_name := '';
END IF;
--输出XML头
line(v_common_info1 || v_common_info2);
--输出样式
FOR i IN 1 .. v_style_tbl.count
LOOP
line(v_style_tbl(i));
END LOOP;
--样式结尾
line('');
--工作表名称
line(v_sheet_name);
END;
--******************************************************************************
-- Procedure: 输出XML文件的结尾信息
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE sheet_end IS
BEGIN
line('
0
0
3
4
False
False
');
END;
--******************************************************************************
-- Procedure: 表格开始
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE table_start IS
BEGIN
line('

END;
--******************************************************************************
-- Procedure: 表格结束
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE table_end IS
BEGIN
line('

');

END;
--******************************************************************************
-- Procedure: 初始化列宽
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE define_column(p_width IN NUMBER, p_span IN NUMBER DEFAULT NULL) IS
BEGIN
IF p_span IS NULL THEN
line('');
ELSE
line('');
END IF;
END;
--******************************************************************************
-- Procedure: 输出报表标题
-- 版本: 1.0
-- Author: 刘峰
-- 说明:   merge: 向右合并 值要比将合并的列小1,比如要合并3列,只需传入2
--        merge_down: 向下合并
--******************************************************************************
PROCEDURE rpt_header(p_text       IN VARCHAR2,
p_merge      IN NUMBER DEFAULT NULL,
p_merge_down IN NUMBER DEFAULT NULL) IS
v_merge      VARCHAR2(100);
v_merge_down VARCHAR2(100);
BEGIN
IF p_merge IS NOT NULL
AND p_merge > 0 THEN
v_merge := 'ss:MergeAcross="' || p_merge || '"';
END IF;
IF p_merge_down IS NOT NULL
AND p_merge_down > 0 THEN
v_merge_down := 'ss:MergeDown="' || p_merge_down || '"';
END IF;
line('
'ss:StyleID="s1">' || p_text ||
'
');
END;
--******************************************************************************
-- Procedure: 输出报表参数
-- 版本: 1.0
-- Author: 刘峰
-- 说明:   merge:向右合并,值要比将合并的列小1,比如要合并3列,只需传入2
--        merge_down: 向下合并
--        index: 单元格的位置(水平第N列)
--******************************************************************************
PROCEDURE rpt_parameter(p_text       IN VARCHAR2,
p_merge      IN NUMBER DEFAULT NULL,
p_merge_down IN NUMBER DEFAULT NULL,
p_index      IN NUMBER DEFAULT NULL) IS
v_merge      VARCHAR2(100);
v_merge_down VARCHAR2(100);
v_index      VARCHAR2(100);
BEGIN
IF p_merge IS NOT NULL
AND p_merge > 0 THEN
v_merge := 'ss:MergeAcross="' || p_merge || '"';
END IF;
IF p_merge_down IS NOT NULL
AND p_merge_down > 0 THEN
v_merge_down := 'ss:MergeDown="' || p_merge_down || '"';
END IF;
IF p_index IS NOT NULL
AND p_index > 0 THEN
v_index := 'ss:Index="' || p_index || '"';
END IF;
line('

'ss:StyleID="m1">' || p_text ||
'');
END;
--******************************************************************************
-- Procedure: 行开始
-- 版本: 1.0row_start
-- Author: 刘峰
-- 说明:Height : 行高度
--******************************************************************************
PROCEDURE row_start(p_height IN NUMBER DEFAULT NULL) IS
v_height VARCHAR2(100);
BEGIN
IF p_height IS NOT NULL
AND p_height > 0 THEN
v_height := 'ss:Height="' || p_height || '"';
END IF;
line('');
END;
--******************************************************************************
-- Procedure: 行结束
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE row_end IS
BEGIN
line('');
END;
--******************************************************************************
-- Procedure: 输出列标题
-- 版本: 1.0
-- Author: 刘峰
-- 说明:  merge的值要比将合并的列小1,比如要合并3列,只需传入2
--        merge_down: 向下合并
--        index: 单元格的位置(水平第N列)
--******************************************************************************
PROCEDURE rpt_title(p_text       IN VARCHAR2,
p_merge      IN NUMBER DEFAULT NULL,
p_merge_down IN NUMBER DEFAULT NULL,
p_index      IN NUMBER DEFAULT NULL) IS
v_merge      VARCHAR2(100);
v_merge_down VARCHAR2(100);
v_index      VARCHAR2(100);
v_wrap       VARCHAR2(100);
BEGIN
IF p_merge IS NOT NULL
AND p_merge > 0 THEN
v_merge := 'ss:MergeAcross="' || p_merge || '"';
END IF;
IF p_merge_down IS NOT NULL
AND p_merge_down > 0 THEN
v_merge_down := 'ss:MergeDown="' || p_merge_down || '"';
END IF;
IF p_index IS NOT NULL
AND p_index > 0 THEN
v_index := 'ss:Index="' || p_index || '"';
END IF;
line('

'ss:StyleID="s2">' || p_text ||
'');
END;
--******************************************************************************
-- Procedure: 输出报表明细
-- 版本: 1.0
-- Author: 刘峰
-- 说明: type 包括 String/Number/DateTime, 注意大小写
--       formula 必须要以=开头
--       merge的值要比将合并的列小1,比如要合并3列,只需传入2
--        merge_down: 向下合并
--        index: 单元格的位置(水平第N列)
--        array_range: 数组公式
--******************************************************************************
PROCEDURE rpt_detail(p_text        IN VARCHAR2 DEFAULT NULL,
p_type        IN VARCHAR2 DEFAULT 'String',
p_formula     IN VARCHAR2 DEFAULT NULL,
p_style.       IN VARCHAR2 DEFAULT NULL,
p_merge       IN NUMBER DEFAULT NULL,
p_merge_down  IN NUMBER DEFAULT NULL,
p_index       IN NUMBER DEFAULT NULL,
p_array_range IN BOOLEAN DEFAULT FALSE) IS
v_style.       VARCHAR2(50);
v_merge       VARCHAR2(50);
v_type        VARCHAR2(50);
v_formula     VARCHAR2(30000);
v_index       VARCHAR2(100);
v_merge_down  VARCHAR2(100);
v_array_range VARCHAR2(100);
BEGIN
IF p_type = 'Number' THEN
v_type := '';
ELSIF p_type = 'String' THEN
v_type := '';
ELSIF p_type = 'DateTime' THEN
v_type := '';
END IF;
IF p_formula IS NOT NULL THEN
v_formula := 'ss:Formula="' || p_formula || '"';
END IF;
IF p_style. IS NOT NULL THEN
v_style.:= 'ss:StyleID="' || p_style. '"';
ELSE
v_style.:= 'ss:StyleID="s7"'; --常规格式
END IF;
IF p_merge IS NOT NULL
AND p_merge > 0 THEN
v_merge := 'ss:MergeAcross="' || p_merge || '"';
END IF;
IF p_merge_down IS NOT NULL
AND p_merge_down > 0 THEN
v_merge_down := 'ss:MergeDown="' || p_merge_down || '"';
END IF;
IF p_index IS NOT NULL
AND p_index > 0 THEN
v_index := 'ss:Index="' || p_index || '"';
END IF;
IF p_array_range THEN
v_array_range := 'ss:ArrayRange="RC"';
END IF;
line('

v_style. ' ' || v_array_range || ' ' || v_formula || '>' ||
v_type || p_text || '');
END;
--******************************************************************************
-- Procedure: 示例代码
-- 版本: 1.0
-- Author: 刘峰
--******************************************************************************
PROCEDURE report_sample(errbuf OUT VARCHAR2, retcode OUT VARCHAR2) IS
g_date_style.     VARCHAR2(10) := 's3'; --普通日期型
g_date_h_style.   VARCHAR2(10) := 's4'; --高亮日期型
g_number_style.   VARCHAR2(10) := 's5'; --普通会计数字
g_number_h_style. VARCHAR2(10) := 's6'; --高亮会计数字
g_normal_h_style. VARCHAR2(10) := 's7'; --通用型
g_normal_style.   VARCHAR2(10) := 's8'; --高亮通用型
g_number4_style.   VARCHAR2(10) := 's9'; --普通会计数字(保留4位小数)
g_number4_h_style. VARCHAR2(10) := 's10'; --高亮会计数字(保留4位小数)
v_person VARCHAR2(50);
BEGIN
--获取提交人名称
BEGIN
SELECT t.full_name
INTO v_person
FROM per_all_people_f t
WHERE t.person_id =
(SELECT fu.employee_id
FROM fnd_user fu
WHERE fu.user_id = fnd_global.user_id)
AND nvl(t.effective_end_date, SYSDATE + 1) > SYSDATE;
EXCEPTION
WHEN OTHERS THEN
SELECT fu.user_name
INTO v_person
FROM fnd_user fu
WHERE fu.user_id = fnd_global.user_id;
END;
--定义XML头信息
cux_common_report_util_pkg.sheet_start(p_author        => v_person,
p_creation_date => to_char(SYSDATE,
'yyyy-mm-dd hh:mi:ss'),
p_company_name  => 'XXXXXX',
p_report_name   => '测试报表');
--表格开始
cux_common_report_util_pkg.table_start;
--定义列
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
cux_common_report_util_pkg.define_column(150);
--输出报表标题
cux_common_report_util_pkg.rpt_header('测试报表', 9);
--输出报表参数
cux_common_report_util_pkg.row_start;
cux_common_report_util_pkg.rpt_parameter('参数1: WELCOME', 2);
cux_common_report_util_pkg.rpt_parameter('参数2: HELLO', 2);
cux_common_report_util_pkg.row_end;
--输出报表列标题
cux_common_report_util_pkg.row_start;
cux_common_report_util_pkg.rpt_title('普通字符型');
cux_common_report_util_pkg.rpt_title('高亮字符型');
cux_common_report_util_pkg.rpt_title('普通数字型');
cux_common_report_util_pkg.rpt_title('高亮数字型');
cux_common_report_util_pkg.rpt_title('会计数字型');
cux_common_report_util_pkg.rpt_title('高亮会计数字型');
cux_common_report_util_pkg.rpt_title('普通日期型');
cux_common_report_util_pkg.rpt_title('高亮日期型');
cux_common_report_util_pkg.rpt_title('普通公式列');
cux_common_report_util_pkg.rpt_title('高亮公式列');
cux_common_report_util_pkg.row_end;
--输出报表明细
cux_common_report_util_pkg.row_start;
--字符类型
cux_common_report_util_pkg.rpt_detail(p_text  => '王小二',
p_type  => 'String',
p_style. => g_normal_style);
cux_common_report_util_pkg.rpt_detail(p_text  => '男性',
p_type  => 'String',
p_style. => g_normal_h_style);
--数值类型
cux_common_report_util_pkg.rpt_detail(p_text  => '1234.345',
p_type  => 'Number',
p_style. => g_normal_style);
cux_common_report_util_pkg.rpt_detail(p_text  => '345.456',
p_type  => 'Number',
p_style. => g_normal_h_style);
cux_common_report_util_pkg.rpt_detail(p_text  => '34324.345',
p_type  => 'Number',
p_style. => g_number_style);
cux_common_report_util_pkg.rpt_detail(p_text  => '34324.345',
p_type  => 'Number',
p_style. => g_number_h_style);
--日期类型
cux_common_report_util_pkg.rpt_detail(p_text  => to_char(trunc(SYSDATE),
'yyyy-mm-dd'),
p_type  => 'DateTime',
p_style. => g_date_style);
cux_common_report_util_pkg.rpt_detail(p_text  => to_char(trunc(SYSDATE),
'yyyy-mm-dd'),
p_type  => 'DateTime',
p_style. => g_date_h_style);
--公式类型
cux_common_report_util_pkg.rpt_detail(p_text    => NULL,
p_formula => '=rc[-6]+rc[-5]',
p_type    => 'Number',
p_style.   => g_number_style);
cux_common_report_util_pkg.rpt_detail(p_text    => NULL,
p_formula => '=rc[-5]+rc[-4]',
p_type    => 'Number',
p_style.   => g_number_h_style);
cux_common_report_util_pkg.row_end;
--表格结束
cux_common_report_util_pkg.table_end;
--工作表结束
cux_common_report_util_pkg.sheet_end;
END;
END cux_common_report_util_pkg;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10359218/viewspace-752601/,如需转载,请注明出处,否则将追究法律责任。

0
0
分享到:

上一篇: Workflow mailer的简要配置
下一篇: 一个查询,取供应商期初余额导入的明细(备查)

请登录后发表评论 登录

全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>

<%for(var j=0;j

<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>

还有<%=items[i].items.total-5%>条评论) data-count=1 data-flag=true>点击查看

<%}%>

<%}%>

<%}%>

asiaidea

注册时间:2010-11-04

  • 博文量

    140

  • 访问量
    474552

最新文章

  • Top 10 Sql (DBA 调优参考)
  • OIE 费用报表审批工作流AME审批组SQL一例(记录)
  • EBS 用户密码处理
  • 查找PA预算审批工作流的下一审批人(记录)
  • AR自动开票程序运行太慢的解决
  • 取帐户段组合及帐户说明组合
  • 请求输出为XML 格式的无法用EXCEL打开的解决
  • 记录
  • AR收款相关操作产生的表变化,随手记录...
  • FORM中按F11进行查询状态后记录显示为白色的处理

支持我们 作者招募 用户协议 FAQ Contact Us

北京盛拓优讯信息技术有限公司. 版权所有  京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510

广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员

转载于:http://blog.itpub.net/10359218/viewspace-752601/

EBS中 EXCEL 格式报表输出的公用API相关推荐

  1. python的json格式输出_python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  2. BeX5报表开发中Excel格式修改的一个小问题

    问题 简单说一下吧.编程时有些问题看起来很简单,但想与做往往就是两回事.计算机编程正是具有这个特点. 目前在修改基于BeX5 3.6的报表格式.使用的自然是report组件,切换到报表设计状态后,使用 ...

  3. 使用jsp实现word、excel格式报表打印-JSP教程,Jsp/Servlet

    转自:http://blog.csdn.net/fenglibing/article/details/1668809 这里使用一个小技巧,就是先将其转换为可编辑的JSP文件,然后再像操作其它的JSP页 ...

  4. 使用jsp实现word excel格式报表打印-JSP教程 Jsp/Servlet

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这里使用 ...

  5. 在java中excel格式变为zip什么原因_Excel工作表中最常见的8类问题,你一定遇到过,附解决方法!...

    在Excel工作表中,最常用的还是一些技巧,如果能够熟练掌握,对于工作效率的提高绝对不是一点点哦,结合工作实际,小编对工作中常见的问题进行了总结,一共有8类,你一定也遇到过-- 一.Excel工作表常 ...

  6. python中json格式数据输出实现方式(无unicode编码输出形式)

    在 http://blog.csdn.net/5iasp/article/details/23338039 的基础上改进了下 不多说了,直接贴代码: # _*_coding:utf-8 _*_ imp ...

  7. ebs 选择excel输出 后缀 html,EBS报表输出文件格式控制

    具体使用方法: 1.添加用户参数p_conc_request_id 2.在BeforeReport trigger中添加srw.user_exit('FND SRWINIT'); 和AfterRepo ...

  8. Report_客制化报表输出Excel后去0问题(案例)

    2014-02-01 Created By BaoXinjian 一.摘要 Oracle  EBS 提供多种报表的开发和输出形式,由于MS Excel在处理数据方面的优势明显,报表输出用Excel打开 ...

  9. EBS 多sheet页Excel动态报表开发过程

    摘自:EBS 多sheet页Excel动态报表开发过程_ITPUB博客 前言 本文讲述的多Sheet页EXCEL报表开发方式和开发HTML,PDF这类报表的方法大致是一致的,唯一不同的是该报表输出是一 ...

最新文章

  1. memset与malloc性能测试(转)
  2. oracle和mysql的备份有几种方法_Oracle 数据库的备份与恢復都有哪几种方法?
  3. pycharm添加python注释头_Pycharm自动添加头注释
  4. 苏州科技大学计算机考研资料汇总
  5. 通过池塘配置ip实验
  6. 《Python编程:从入门到实践》配套源代码下载
  7. 基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法--开启从小白到精通的基于文献计量学论文写作之旅
  8. 内嵌式js微信扫码登录及自定义样式
  9. 备战秋招,LeetCode算法大总结,啃下这块硬骨头
  10. 16 个动态图!一款好用到爆的 Python 可视化利器
  11. ural 1998 The old Padawan (模拟+二分)
  12. 翻译并添加 解析OV13850 datasheet
  13. Java基础之《JVM性能调优(3)—堆》
  14. GBase 8s 数据库问题知识库(2020-06-17更新)
  15. rails 单复数转换
  16. WPS表格的IF与AND函数典型应用实例
  17. 谷粒商城六商品服务三级分类
  18. 骨传导原理是什么,骨传导耳机优缺点
  19. 空间转录组整合方法SPOTlight
  20. Crowbar 电路

热门文章

  1. 【算法】遗传算法及其 Java 实现
  2. java特殊字符转义html_HTML特殊字符转义
  3. struts2框架之struts框架介绍
  4. 使用 SAP UI5 FileUploader 控件上传本地文件试读版
  5. springboot-使用Thymeleaf
  6. 1400协议是什么和28181区别_28181平台对接接口详解
  7. java设计模式-备忘录模式
  8. 初识OpenGL (-)坐标系统(Coordinate System)
  9. Microsoft Word 教程:如何在 Word 中插入艺术字?
  10. 【SQL开发实战技巧】系列(十四):计算消费后的余额计算银行流水累计和计算各部门工资排名前三位的员工