楼主: smztsmzt
1901 0

[学习心得] 一个判断xlsx表格指定区域是否为空的MATA函数 [推广有奖]

  • 0关注
  • 9粉丝

已卖:1516份资源

硕士生

4%

还不是VIP/贵宾

-

威望
0
论坛币
2984 个
通用积分
407.5325
学术水平
73 点
热心指数
72 点
信用等级
62 点
经验
1206 点
帖子
51
精华
0
在线时间
131 小时
注册时间
2011-4-7
最后登录
2025-3-17

楼主
smztsmzt 在职认证  发表于 2018-9-20 12:02:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币


最近在编写适合日常工作数据集格式化输出的命令,其中需要解决在已有xlsx表格中连续输入且不覆盖原来内容,没有找到更好的方法,自己按照理解编写了一个MATA函数实现,现与Stata爱好者分享。自己水平有限,如果有更好的思路请各位不吝赐教,谢谢。


以下是代码和测试用的xlsx表格
table.xlsx (6.6 KB)


  1. /*********************************************************
  2. row_emptyrange 函数
  3. 用途:检测某个当前目录下xlsx表中某个sheet指定区域是否为空,
  4.           并返回与指定区域大小相同且为空的起始行数,
  5.           可以用于读取已有的xlsx表,在不覆盖原有内容的基础上,
  6.           寻找合适的位置输出新的内容,类似于append的作用
  7. *********************************************************/

  8. mata: mata clear
  9. mata:
  10. real scalar row_emptyrange(string scalar tablename, string scalar sheetname, /// //指定的表格名称和sheet名称
  11.                                  real scalar row1, real scalar row2, /// //指定区域的行范围 第row1行至第row2行 row1>=row2
  12.                                  real scalar col1, real scalar col2)     //指定区域的列范围 第col1列至第col2列 col1>=col2
  13. {
  14.         class xl scalar   b                 // 初始化xl()类
  15.         string vector     cells     // 声明字符串向量 用于存储指定的区域
  16.         real scalar       i                        // 判断指定区域的长度
  17.         real vector       rowrange  // 声明实数向量 行范围
  18.         real vector       colrange  // 声明实数向量 列范围
  19.         
  20.         i=0
  21.         rowrange=(row1\row2)
  22.         colrange=(col1,col2)

  23.         b.load_book(tablename)                // 加载表名
  24.         b.set_sheet(sheetname)      // 加载sheet名
  25.         cells=b.get_string(rowrange,colrange) // 获取指定位置的内容

  26.         printf("The first specified range is:  row[%f,%f] and col[%f,%f]\n", row1,row2,col1,col2)
  27.         cells                                                // 显示指定区域大小的内容
  28.         i=rowsum(colsum(ustrlen(cells)))    // 判断指定区域的长度
  29.         printf("The length of initially specified range is: %f\n",i)

  30.         while (i) {                                                        // 如果长度不为0
  31.                 row1=row1+1                                                // 则行范围递增1 此处可以修改进行快速判断
  32.                 row2=row2+1                                                // 同上
  33.             rowrange=(row1\row2)
  34.                 cells=b.get_string(rowrange,colrange) // 列范围不变
  35.             i=rowsum(colsum(ustrlen(cells)))      // 判断指定区域的长度
  36.                 cells                           // 显示指定区域大小的内容
  37.             printf("The length of the new range with the same size as the initially specified range is: %f\n",i)
  38.         }
  39.         printf("The row of the new range with same size is: %f\n", row1)

  40.         return(row1)                                         // 返回输出新表的起始行数 可以修改
  41.         
  42. }
  43. end

  44. mata: row_emptyrange("table.xlsx","Sheet1",1,6,1,4)
复制代码








二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分学术水平 热心指数 信用等级 收起 理由
txje + 2 + 2 + 2 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2025-12-31 14:42