夜雨聆风学习资料网

ARTICLE · 1295701

56个Excel函数,放到电力交易里怎么用?(带公式,可复制)

56个Excel函数,放到电力交易里怎么用?(带公式,可复制)

长期分享电力和AI知识。如果有什么不同见解,欢迎分享观点,感谢点击♥和👍,谢谢!

客户问这个月用了多少电,你要从明细里找数;月底核对购电成本,要把电量和价格一笔笔对上;做交易复盘,还得找出哪些时段花的钱最多。

我用同一张小表,边算边讲。遇到什么业务,该用哪个函数,公式又有哪些容易用错的地方,都放在对应的例子里。SUMIFS、SUMPRODUCT这类函数平时会经常用到(这2我每次直播都讲);LENB、INDIRECT用得少一些,知道它们就够了。

先看四笔电量,后面都用这张表来讲

新建一个工作表,取名“明细”。从A列到F列,依次填写:时间、用户、时段组、电量MWh、电价元/MWh、金额元。

  • 第2行:2026/10/01 00:00;SIM-U01;A段;1;200;200。
  • 第3行:2026/10/01 01:00;SIM-U01;B段;4;800;3200。
  • 第4行:2026/10/01 02:00;SIM-U02;B段;2;300;600。
  • 第5行:2026/10/01 03:00;SIM-U02;A段;3;100;300。

SIM-U01和SIM-U02是两个示例客户的编号。MWh就是兆瓦时,1MWh等于1000度电。第一笔买了1MWh,每MWh是200元,金额自然是200元;第二笔买了4MWh,单价800元,金额就是3200元。

F2填写=D2*E2,再向下填到F5,这四笔金额就算出来了。A列按日期时间填写,电量和电价按数字填写。后面的计算公式放在表内空白位置,别覆盖这四行数据。

数字都是假设。我只抽取四笔演示,不是整个月的完整账单。A段、B段只是方便比较的分组,不是广东规定的峰谷时段;这里也只算电量乘价格的金额,实际账单中的合同结算、输配等项目要另算。

一、先回答:用了多少电,花了多少钱?

01|SUM:把电量和金额加起来

收到一张电量表,先看合计数,是最常见的第一步。

=SUM(D2:D5)

就是把D2到D5的电量加起来,得到10MWh。换成=SUM(F2:F5),总金额是4300元。后面不管按客户拆,还是按日期拆,加回来的合计都应该对得上这两个数。

02|SUMIF:只算某个客户的电量

如果只想知道客户SIM-U01用了多少电,就给求和加一个条件。

=SUMIF(B2:B5,"SIM-U01",D2:D5)

意思是:“到B列找SIM-U01,把对应D列的电量加起来。”结果是1+4=5MWh。它按公式里的条件计算,不是只计算屏幕上看得见的行;把某些行隐藏起来,不会让它少算。

03|SUMIFS:既指定客户,又指定日期

客户接着问:“那10月1日这一天,金额是多少?”这就不止一个条件了,要用SUMIFS。

=SUMIFS(F2:F5,B2:B5,"SIM-U01",A2:A5,">="&DATE(2026,10,1),A2:A5,"<"&DATE(2026,10,2))

意思是:找SIM-U01,找10月1日这一天,再把金额加起来,结果是3400元。日期写成“从当天零点开始,到次日零点之前”,01:00、02:00这些时点才不会漏掉。

04|SUMPRODUCT:算出每买一兆瓦时,实际花了多少钱

把200、800、300、100四个价格平均,得到350元/MWh。但这四笔电实际花了4300元,买到10MWh,每MWh的成本应该是430元。

=SUMPRODUCT(D2:D5,E2:E5)/SUM(D2:D5)

SUMPRODUCT先把每笔电量乘以对应价格,全部加起来后,再除以总电量。这两个数别混了:350元/MWh是四个时点的普通平均价,430元/MWh才是这几笔电实际买回来的单位成本。高价的时候买得多,实际成本就会被拉高。 这就是按电量加权。表里如果还有卖出电量,买和卖要分开算。

05|COUNT:看看电量有没有被存成文字

有时一列看着都是数字,加起来却少了一笔。原因可能是某个“数字”其实被Excel当成了文字。

=COUNT(D2:D5)

正常应得到4,说明这四格都被Excel识别成了数值。如果只有3,就要找找哪一格出了问题。它能帮你查这类问题,但数字本身填得对不对,还得回看原始记录。

06|COUNTA:数一数,有多少行填了客户

客户编号是文字,用COUNTA来看有没有填写。

=COUNTA(B2:B5)

结果是4,意思是四行都有内容,可不是有四个客户。我们实际只有两个客户,各出现两次。还有一种容易忽略的情况:单元格里有公式,只是看起来是空白,COUNTA仍会把它算进去。

07|COUNTIF:数一数高价记录

假设我们想先看,价格达到500元/MWh的记录有几条。

=COUNTIF(E2:E5,">=500")

结果是1。500只是这次分析自己选的分界,不是市场限价。如果同一个小时的价格出现在多个客户的行里,数出来的是多条记录;要回答“高价持续了几个小时”,同一小时只能数一次。

08|COUNTIFS:检查同一笔电量有没有记重

同一个客户、同一个小时,是否被导入了两次?就让COUNTIFS同时检查客户和时间。

=COUNTIFS(B2:B5,B2,A2:A5,A2)

结果是1,也就是与第2行客户、时间相同的记录只有一条。如果是2,先查查是不是真重复。两行也可能属于不同交易品种,不能直接删。同样的写法还能统计某客户的高价记录:=COUNTIFS(B2:B5,"SIM-U01",E2:E5,">=500"),本例是1条。

09|COUNTBLANK:检查有没有漏填电价

算金额前,先看价格是否齐全。

=COUNTBLANK(E2:E5)

本例是0,也就是没有空白价格。如果有空白,先查清再算账。没查到电价,和电价确实是0,是两回事。 写着“待匹配”的格子也不算空白;公式显示的空字符串则会被它计入,不能只凭肉眼判断。

二、接着看:价格高在哪,钱主要花在哪?

10|MAX:找最高电价、最大金额

=MAX(E2:E5)得到最高电价800元/MWh;=MAX(F2:F5)得到最大单笔金额3200元。

这两个数值得分开看。价格很高,但买得很少,花的钱未必多;价格不算最高,却买了很多,也可能是主要成本。找到数值后,再回到明细查看发生在哪个小时。

11|MIN:找最低电价

=MIN(E2:E5)得到100元/MWh。研究低价采购或储能充电时段,先把最低价找出来。

但“那一小时价格最低”,还不等于“我一定能在那一小时买够电”。还得继续看可买数量、用电需求和设备能力。数据里如果出现负电价,真实数值也得保留,不能直接改成0。

12|AVERAGE:看价格的普通平均水平

=AVERAGE(E2:E5)得到350元/MWh,就是四个价格相加再除以4。

想看这几个时段的大致价格,用AVERAGE没问题。但它不管每个时段买了多少电。所以,要回答“我们每兆瓦时花了多少钱”,还得看第04项的430元/MWh。算之前也得看看,有没有漏时段,或者把同一时段放了两次。

13|SMALL:找第2低、第3低的价格

=SMALL(E2:E5,2)得到200元/MWh,末尾的2就是“第2低”。

看储能充电机会时,光知道最低价还不够,还得看低价时段多不多、连不连续。SMALL把第2低、第3低的价格找出来后,再回时间表看是哪几个时段。如果最低价出现两次,这两次都会占位置,不会自动合并成一个数。

14|LARGE:找出金额最大的几笔

=LARGE(F2:F5,2)得到600元,即第2大的单笔金额。想查第2高电价,就把范围改成E列,结果是300元/MWh。

月底复盘时间有限,可以先从金额较大的记录查起。不过花钱多未必是买错了,也可能那时必须用电。要判断交易做得好不好,还得比较:当时有没有可行、成本更低的选择。

15|RANK:给价格排个名次

在G2输入=RANK(E2,$E$2:$E$5,0),向下填到G5,名次依次是3、1、2、4。最后的0表示价格越高,排得越靠前。

排名靠前的记录就能直接筛出来。价格相同时会并列,所以“前10名”有时不止10条。如果必须选10条,同价时按金额排,还是按时间先后排,得提前定好。

16|MEDIAN:看看中间水平,少受极端价格影响

=MEDIAN(E2:E5)得到250元/MWh。把四个价格从低到高排成100、200、300、800,中间的200和300取平均,就是250。

普通平均价是350,中位价是250,能看出800这个高价把平均值拉高了。看价格分布时,中位数很有用。但算实际花费时,高价那一笔仍要一分不少地计入。

17|AVERAGEIF:比较不同时间段的均价

=AVERAGEIF(C2:C5,"B段",E2:E5)得到550元/MWh,是800和300的平均;A段则是150元/MWh。

想比较哪组时段的价格通常更高,就用AVERAGEIF。实际工作中也可以按峰、平、谷来比较,但得先确认当地、当期的时段划分。这里的A段、B段只用来演示,不能直接拿去做广东电费结算。

18|AVERAGEIFS:只看某客户、某一时段组的均价

=AVERAGEIFS(E2:E5,B2:B5,"SIM-U01",C2:C5,"B段")得到800元/MWh。

它比上一项多了一个客户条件。不过这次只有一条记录符合条件,800就是那一条的价格。就凭这一条,还不能说这个客户长期买电更贵。看均价时,顺手再看看一共有多少条记录参与计算。

三、算账时,这些小数和时间怎么处理?

19|INT:把“日期加时间”变成“只有日期”

想把一天24小时汇总成日报,可以先从时间里取出日期。输入=INT(A3),把结果设置成日期格式,就会看到2026/10/01。

Excel把日期和时间存在同一个数里,整数部分是日期,小数部分是当天的时间。INT取到日期,按天汇总就方便了。但碰到负数别按“去掉小数”来理解:=INT(-1.8)的结果是-2。

20|ROUND:把金额保留到小数点后两位

=ROUND(SUM(F2:F5),2)会把合计金额保留两位小数,算出来是4300。想让表里显示4300.00,得再把显示格式设成两位小数。一个是计算结果,一个是显示样式,别混在一起。

对账时,这里常差一分钱:两笔0.004元,各自四舍五入后相加是0.00元;先加成0.008元,再四舍五入则是0.01元。先算合计再取小数,还是每笔取完再相加,要按结算要求统一。

21|ROUNDUP:不够一个数量单位时,往多了取

假设计划需要3.14159MWh,而这道练习要求按0.1MWh填写,那么=ROUNDUP(3.14159,1)得到3.2MWh,取完不会少于原需求。

实际交易允许按多小的单位申报,要查对应要求,不能照搬0.1。还要记住,ROUNDUP对负数是往离0更远的方向取:=ROUNDUP(-3.14159,1)得到-3.2。

22|ROUNDDOWN:不能超过上限时,往少了取

如果最多只能安排3.14159MWh,同样按0.1MWh填写,=ROUNDDOWN(3.14159,1)得到3.1MWh。

做储能计划时,这可以帮助控制填写数量,但储能到底能放多少电,还得先算清剩余电量、功率和效率。对负数,它往靠近0的方向取:=ROUNDDOWN(-3.14159,1)得到-3.1。

23|RAND:试试看,电量变一点会怎样

做报价测算时,可以先问:“如果用电量比预计多5%,或者少5%,成本会变多少?”

=D2*(0.95+0.10*RAND())

本例会生成0.95至1.05MWh之间的电量,包含0.95、不包含1.05。这只是随机试算,不是负荷预测。表格重新计算时,数字还会变;想保留这次结果,就先复制,再用“选择性粘贴”只保留数值。

24|MOD:只取时间中的几点几分

想比较每天凌晨1点的电价,先把时刻提出来会更方便。输入=MOD(A3,1),把结果的显示格式设成hh:mm,就能看到01:00。

它取的是日期时间中的小数部分。原日期列还要留着,否则10月1日的01:00和10月2日的01:00就分不清了。

四、遇到不同情况,让公式知道该怎么处理

25|AND:几个条件都满足,才算通过

比如我们想筛出“电量大于0,而且电量、电价都填的是数字”的记录,可以写:

=AND(D2>0,COUNT(D2:E2)=2)

本例得到TRUE,就是这两个条件都满足。AND就是“既要这样,也要那样”。这里没有要求电价必须大于0,因为真实价格可能是负数;电量是0的记录也可以另行查看,不必直接删掉。

26|OR:符合其中一个条件,就找出来

如果负电价要看,高于600元/MWh的价格也要看,可以写:

=OR(E2<0,E2>600)

第2行的200元返回FALSE,第3行的800元返回TRUE。这是在帮你挑出值得关注的记录,不是在判定价格有错。600是这次练习自选的分界,负价本身也不代表数据错误。

27|NOT:把某个条件反过来

这条公式这么读:=NOT(B2="SIM-U01"),“这行不是SIM-U01吗?”第2行返回FALSE,SIM-U02所在行返回TRUE。

想先排除一个客户、看看其余客户时,可以这样设置筛选条件。不过空着的客户栏也满足“不是SIM-U01”,所以漏填客户的行要另外处理。

28|IF:有电量就算单价,没电量就提示

计算每兆瓦时成本时,金额要除以电量。如果电量是0,就不该继续相除。

=IF(D2=0,"无电量",F2/D2)

本例得到200元/MWh;电量是0时显示“无电量”。IF就是“如果……就……否则……”。如果一行没有电量却有金额,别直接忽略,继续查查是固定费用还是填错了。

29|IFNA:查不到价格,就明明白白标出来

先新建“价格表”。A1写“时间”,B1写“电价元/MWh”;把“明细”的A2:A5复制到价格表A2:A5,把E2:E5复制到价格表B2:B5。这样每个时点都对应一个价格。本例只放同一地区、同一种价格,不混入旧版数据。

=IFNA(VLOOKUP(A2,价格表!$A$2:$B$5,2,FALSE),"待匹配")

本例查到200;找不到时会显示“待匹配”。IFNA专门处理#N/A这类未找到结果的错误。查不到价格时,写出问题比填个0更有用,否则漏价的那笔电量会显得像是免费买来的。

30|IFERROR:报错时,换成看得懂的提醒

=IFERROR(F2/D2,"核查电量或金额")正常算出200;遇到除以0等错误,就显示“核查电量或金额”。

它能处理的公式错误比IFNA多,但提醒只是为了方便查错,不是把错误消除了。如果公式没报错,只是引用了错误的电价,它也看不出来。

五、价格在另一张表里,怎样准确找过来?

31|LOOKUP:按价格高低分档

新建“分档表”,A2:A5填0、300、600、1000;旁边B2:B5填低档、中档、高档、极高档。这四档是我们自己为了方便分析设的。

=LOOKUP(E3,分档表!$A$2:$A$5,分档表!$B$2:$B$5)

800会被分到“高档”:它达到600,但还没到1000。左边的数字一定要从小到大排。LOOKUP是按区间分档的,不是用来精确查某个交易时点的。负价低于这张表的第一档时,会报#N/A,得单独处理。

32|VLOOKUP:按时间找到对应电价

接着用第29项建好的“价格表”。想查01:00的价格,在“明细”的空白格输入:

=VLOOKUP(A3,价格表!$A$2:$B$5,2,FALSE)

结果是800元/MWh。VLOOKUP在选定范围的第一列找到A3这个时间后,取同一行第2列的价格;FALSE要求时间完全相同。查之前先看看,同一个时间是不是只对应一条价格。如果还有不同地区、日前和实时等多种价格,就不能只凭时间来找。

33|HLOOKUP:价格横着排,也能找

有些表把季度横着排。新建“季度参数”:A1:D1依次填季度、Q1、Q2、Q3;A2:D2填参考价、300、350、400,单位是元/MWh。

=HLOOKUP("Q2",季度参数!$A$1:$D$2,2,FALSE)

结果是350。HLOOKUP在第一行找到Q2后,取该列第2行的值。VLOOKUP沿第一列往下找,HLOOKUP沿第一行往右找,表怎么摆,函数就怎么选。

34|INDEX:告诉它位置,把那个数取出来

=INDEX(价格表!$B$2:$B$5,3)得到300元/MWh。

就是“在B2到B5这四个价格里,取第3个”。这里从B2开始数,所以第3个在B4,不是工作表第3行。单独用INDEX,得自己知道位置;下一项MATCH就是来找位置的。

35|MATCH:先找位置,再交给INDEX取价格

=MATCH(A3,价格表!$A$2:$A$5,0)得到2,说明01:00在这四个时间里排第2个。末尾的0,是要求两边完全相同才算找到。

把两步合起来,就是:

=INDEX(价格表!$B$2:$B$5,MATCH(A3,价格表!$A$2:$A$5,0))

结果是800元/MWh。MATCH负责找哪一行,INDEX负责拿那一行的价格。查找列和价格列可以分别指定,表格列位置变化时也更容易调整。同一时点有多个价格时,仍要先分清自己要哪一种。

36|CHOOSE:方便切换低、中、高三种假设

做零售报价测算,可能想看看:采购价分别按300、400、500元/MWh,利润会差多少。

=CHOOSE(2,300,400,500)

结果是400,也就是从后面三个价格里选第2个。把前面的2改成1或3,就能切换假设。这些价格只拿来试算,不是预测结果,也不代表三种情况的概率相同。

六、日期弄清楚,才不会错

37|TODAY:算算合同还有多久到期

=DATE(2026,12,31)-TODAY()计算今天到2026年12月31日还差多少天。假设今天是2026年10月30日,结果是62天。

拿它做合同到期提醒很方便,因为过一天,结果就会跟着变。但如果要保存“当时还有多少天”的历史记录,就要把那一次的结果固定下来。到期当天算不算,按合同约定来。

38|DATE:把年、月、日拼成一个日期

=DATE(2026,10,1)得到2026年10月1日。做按日、按月汇总时,可以用它写清楚统计从哪天开始。

它比只写“10/1”更明确,但不会帮你拦住所有输入错误。例如月份写13,Excel会顺延到下一年,而不是提醒“月份填错”。年份、月份、日期仍要核对。

39|YEAR:从日期里取出年份

=YEAR(A2)得到2026。整理跨年的采购记录、做年度电量比较时,可以用它增加一列年份。

先确认取的是哪种日期:用电日期、开票日期还是合同签订日期。同样一笔业务,这几个日期可能不在同一年,年度报表要选对。

40|MONTH:按月份查看电量和成本

=MONTH(A2)得到10,做月报时很常用。

但“10月”没有年份。把两年的数据放在一起,仅按10汇总,就会把两年10月合并。可以把年、月一起用,也可以用=DATE(YEAR(A2),MONTH(A2),1)得到2026/10/01,用这个日期代表2026年10月。

41|DAY:取出这是一个月的第几天

=DAY(A2)得到1,方便按月内日期排列数据,看看哪一天少了记录。

它只能告诉你“几号”,不能告诉你星期几或是不是节假日。做负荷分析时,工作日、周末、调休等信息还要配合日历补充。

42|NOW:显示现在的日期和时间

=NOW()会显示当前日期和时间,用在报表上可以提醒自己这次计算是什么时候。

别把时间更新和电价数据更新当成一回事。若要记录数据什么时候下载、什么时候发布,就保存当时的实际时间。不然每次打开表格,NOW都会把它改成“现在”。

43|DATEDIF:算两个日期相隔多少天

=DATEDIF(DATE(2026,10,1),DATE(2026,10,31),"D")得到30,最后的D表示按天计算。

算合同期间,或者两个结算日期隔了多久,都可以用DATEDIF。10月1日到10月31日相隔30天;如果业务要求首尾两天都算,那就是31天。这两种算法别混,开始日期也不能晚于结束日期。

七、导出的文字看着乱,这些函数

44|LEFT:从左边取出地区名称或编号

我们给一个示例文件起名GD-DA-20261001,其中GD表示地区,DA表示日前,后8位是日期。

=LEFT("GD-DA-20261001",2)得到GD,也就是从左边取2个字符。文件都按同一种方式命名时,就能按前两位分类。这里的命名是示例,实际文件要先看清自己的命名规则。

45|RIGHT:从右边取出日期

=RIGHT("GD-DA-20261001",8)得到20261001。

每天收到一批同格式文件时,RIGHT能把末尾日期取出来。不过取出来的还是文字,得转成日期后才能做日期计算。如果文件名后面还有.xlsx等后缀,就要先把后缀去掉,不能直接取最后8位。

46|MID:取出中间的交易品种

=MID("GD-DA-20261001",4,2)得到DA,意思是从第4个字符开始取2个。

地区、日前或实时、日期,就能这样拆成几列。MID要求文件名的格式比较整齐。如果地区名称有长有短,中间内容的位置也会变,这时再用下面的FIND找位置。

47|FIND:先找到分隔符,再拆文字

=FIND("-","GD-DA-20261001")得到3,就是第一个横线在第3位。再配合LEFT:=LEFT("GD-DA-20261001",FIND("-","GD-DA-20261001")-1),就能取出横线前面的GD。

48|LEN:找出多余空格这类小问题

两个客户编号看着一样,却总是匹配不上,原因可能只是末尾多了一个空格。

=LEN("SIM-U01")得到7,=LEN("SIM-U01 ")得到8。

49|LENB:遇到旧系统的字节长度要求时再用

=LENB("电价")在支持双字节语言的Excel环境中,通常得到4;换一种语言设置,结果可能不同。

普通电量和成本分析很少用到它。只有旧系统明确按这类字节长度限制导入内容时,才需要用LENB。

50|TEXT:把日期整理成容易辨认的样子

想把时间和客户编号放在一起,方便核对,可以写:

=TEXT(A2,"yyyy-mm-dd hh:mm")&"|"&B2

结果是2026-10-01 00:00|SIM-U01,哪天、几点、哪个客户一眼能看明白。TEXT会把结果变成文字,所以原来的日期列要留着。这里保留到分钟;如果原数据精确到秒,就不能省掉秒后还认为每条记录都能分清。

51|VALUE:把看起来像数字的文字变回数字

=VALUE("123.45")得到数值123.45。电量从网页或其他文件复制过来,不能正常求和时,先看看它是不是文字。如果是,再用VALUE转回数值。

但客户编号不要随手转成数字,比如00123转完会丢掉前面的0。带单位的金额还要先去掉单位,具体写法见第53项。

52|REPLACE:替换指定位置的一段文字

=REPLACE("GD-DA-20261001",7,8,"20261002")得到GD-DA-20261002,也就是把从第7位开始的8个字符换成新日期。

按固定规则生成新报表名称时,REPLACE很好用。但别弄混:这里改的是文件名,不是文件里的数据。生成10月2日的名称后,里面还得放10月2日的数据。

53|SUBSTITUTE:去掉文字里的单位,再转成数字

有的电价单元格写着“123.45元/MWh”,先去掉已确认的单位,再把剩下的文字转成数值:

=VALUE(SUBSTITUTE("123.45元/MWh","元/MWh",""))

结果是123.45。这里只是去掉文字,没有换算单位。0.35元/kWh等于350元/MWh,不能删掉单位后就直接当0.35元/MWh。

八、最后三个:编序号、找列数、按地址取值

54|ROW:给明细加上序号

=ROW(A2)-ROW($A$2)+1得到1,向下填充就是2、3、4。

打印明细、讨论某一行时,有序号会方便些。不过重新排序或插入记录后,行号可能变化。想长期追踪一笔交易,仍应记录它属于哪个客户、哪个时间和哪个交易品种,不能只记“第20行”。

55|COLUMN:知道某一列排第几

=COLUMN(E2)得到5,说明E列是第5列。本例第5列放的是电价。

整理宽表、检查取数位置时可以用它。如果下载的新模板调整了列顺序,第5列可能已经变成别的内容,所以还要看表头,别只记住列号。

56|INDIRECT:把单元格里写的地址,变成真正的引用

另建“引用演示”工作表,B1写E2,E2填200,在F2输入=INDIRECT(B1),就得到200。它先读到B1里的“E2”,再去E2取值。

由选项控制取数位置的小工具,常会用到INDIRECT。不过表格越复杂,文字写成的地址越不好排查;插行、改名后,也不一定自动跟着调整。日常购电账本能直接引用清楚的单元格,就不必绕这一层。

来个练习题,哈哈

先算两个客户各自的账:SIM-U01买了5MWh,花了3400元,平均每MWh花680元;SIM-U02同样买了5MWh,花了900元,平均每MWh花180元。合起来10MWh、4300元,每MWh是430元。

再看800元/MWh那一笔:它占总电量40%,却花掉总金额的约74.42%。这时就要问:“为什么偏偏在这一小时买得多?”可能是必须用电,也可能与申报量或合同安排有关,得往下查才知道。

练习时,可以故意把一个电量存成文字、漏填一个价格,再重复放入一条记录。看看自己能不能发现问题、恢复原来的账,并解释为什么四个价格平均是350元/MWh,实际购电成本却是430元/MWh。


回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料