<电子幽灵>办公软件笔记:Excel学习笔记(一)

Excel学习笔记(一)

介绍

费曼学习法最重要的部分,即把知识教给一个完全不懂的孩子——或者小白。
为了更好的自我学习,也为了让第一次接触某个知识范畴的同学快速入门,我会把我的学习笔记整理成电子幽灵系列。
提示:作为低代码工具的笔记,这里会用特殊字体表示要用到的函数等等。请若要学习,请结合相关工具边用边学。


本篇笔记通过对百职帮课程资料及微软Office使用手册的学习总结得出。

简介

人生漫漫,即使你在某个时间点从未想过这样的可能,但是还是会发生这样的事情,比如说——在某个时间某个地点,突然要你做一些管理、汇报等比较务虚的事情,有时是人员,有时是财务,有时是时间等等。要把抽象的管理具象化为具体的工作是件难事,好在前人已经帮我们做了很多工作,把他们具象化成了表格、幻灯片和文档等等。

对于这个平台的很多同志,因为一些众所周知的原因,能够成为管理层的机会有时是可遇不可求的,为了帮助大家找到、抓住甚至拿捏这样好的机会,这里还是强烈建议大家学习一些先进的、广泛存在的工具,例如Excel、PPT、Word等等。在一体式AI化办公用具还没有出现的当下,我们可以先学习一些使用技巧,以备不时之需。

很多同志在初次遇到办公软件时可能会觉得它很简单,也有一部分刚开始觉得它很困难。这是因为一部分人专注于实用性,而另一部分更专注于系统性。最好的学习方式当然是折中:在使用的基础上,系统的学习相关的知识。

Excel作为低代码可视化统计工具的典范之作,是必然要学习的;不仅在日常工作中能使用得到,而且在运用得当之后,它还可以为Word文档和幻灯片增添一抹奇幻色彩,甚至于夺走一部分后两者的工作。

我们可以先从最基础的函数开始学起,Excel的很大一部分魅力就隐藏在其中。

Function in Excel

如果非要说Excel有编程元素的话,那就是隐藏在表格中的函数调用功能了。在最基础也最常见的用法当中,表格中一般写着的是各种数据、文字。但是只是这样做完全无法发挥出Excel的功能。其一,有很多的数据是不必我们写出的,对原始数据进行管理和调用函数,可以一键得到非常多的衍生数据,满足我们的统计需求;其二,Excel作为管理工具,有很多数据需要进行变化;一个个数据进行手动变化极其复杂且浪费时间,而函数可以达到牵一发而动全身的奇妙效果。

在当前流行版本的Excel中,函数大约有400如果想用函数的话,需要在单元格中使用公式,再在公式中包含函数。

如何在Excel中写函数

公式由以下几个部分组成:

  1. 在开头写=
  2. =后面是表达式(具体数值,或者引用单元格内容)或者函数
  3. 表达式是带+、-、*、/、<或>的式子,可以对函数或者数值或者单元格内容进行计算。

可以看出,函数是公式的一部分内容,也可以是表达式的一部分。

函数则由以下几个部分组成:

函数名称(参数1,参数2,…,参数n)

在写函数的时候,智能的Excel软件会自动弹出可能匹配的函数;选中某单元格后,点击对话框边的 f x fx fx也可以调用函数对话框。对话框会自动补全""和()

对于新手和比较复杂的函数,推荐使用对话框;对于熟练掌握者和比较简单的函数,推荐手写+智能匹配。

函数示例:TODAY()
TODAY():自动更新当天日期

选中某个单元格,输入=TODAY(),这个格子里面的数据即可变为当前日期。

和其他函数一样,TODAY()的结果可以作为表达式的一部分

基于经典函数的使用示例:XLOOKUP()
XLOOKUP():按行查找表或区域中的项

以个人信息表格为例。如果我们想知道一个人的家庭住址,我们要先找Ta的名字,再去找对应的地址信息。

个人信息表格一般是每行一个人的信息,所以Ta的名字和地址信息一般都在同一行。这时我们可以用XLOOKUP()函数。

XLOOKUP()函数是Excel中一个非常强大的查找函数,用于在范围或数组中查找特定值,并返回对应的值。它比传统的VLOOKUP()和 HLOOKUP()函数更灵活和功能强大。

  1. XLOOKUP()的格式及各个参数

XLOOKUP()的基本语法如下:


XLOOKUP(lookup_value, lookup_array, return_array, [if_not_found], [match_mode], [search_mode])

  1. 各个参数的解释
  • lookup_value:要查找的值,可以是单个值或者单元格引用。

  • lookup_array:要查找的范围或数组。这个范围或数组应该包含你要搜索的值。

  • return_array:当在 lookup_array中找到匹配项时,要返回的值的范围或数组。

  • if_not_found(可选):如果没有找到匹配的值,这里可以指定要返回的内容。例如:可以设置为“未找到”或0等。

  • match_mode(可选):指定查找的匹配方式。可以取以下几种值:

    • 0或省略:精确匹配。
    • -1:精确匹配,如果找不到,则返回下一个小于查找值的值。
    • 1:精确匹配,如果找不到,则返回下一个大于查找值的值。
    • 2:通配符匹配(如 * 和 ?)。
  • search_mode(可选):指定搜索的方向。可以取以下几种值:

    • 1或省略:从第一项到最后一项的顺序搜索。
    • -1:从最后一项到第一项的反向搜索。
    • 2:按二分搜索 (需要 lookup_array已排序)。
    • -2:按反向二分搜索 (需要lookup_array已排序)。

3.应用场合的例子

假设你有一个产品表,包含产品名称和价格,数据如下:

产品名称价格
苹果5
香蕉3
橙子4
6

如果你想查找“香蕉”的价格,可以使用以下公式:


=XLOOKUP("香蕉", A2:A5, B2:B5, "未找到")

在这个例子中:

  • lookup_value 是 “香蕉”
  • lookup_array 是产品名称的范围 A2:A5
  • return_array 是价格的范围 B2:B5
  • if_not_found 设置为 “未找到”

这个公式会返回3,因为“香蕉”的价格是3。如果你查询一个不存在的产品,例如“樱桃”,则会返回“未找到”。

XLOOKUP()函数的灵活性和功能使得它在数据查找和引用时非常有用,特别是在面对大数据集时,可以简化查找操作,提高效率。

最常用函数介绍

微软总结了常用的函数,它们既简单又好用,这里一一做出介绍。

SUM():对单元格中的值求和

SUM()函数是Excel中用于求和的函数,可以快速计算一组数字的总和。它可以对单个单元格、多个单元格区域或是数值数组进行求和。

  1. 函数格式:

    
    SUM(number1, [number2], ...)
    
    
  2. 参数介绍:

    • number1:必需,表示要相加的第一个数字或单元格引用。
    • number2:可选,表示要相加的其他数字或单元格引用,可以有多个。
    • 你可以在函数中输入最多255个参数,参数可以是数字、单元格引用、区域引用等。

通过使用SUM()函数,可以方便地对多个数据进行求和操作,在数据分析和财务计算中非常实用。

IF():逻辑比较用三元运算符

IF() 函数是 Excel 和其他电子表格软件中一个非常常用的逻辑函数,用于执行条件判断。其功能是根据给定的条件,返回不同的结果。

IF() 函数根据指定的逻辑条件,检查该条件是否为真(TRUE)或假(FALSE)。当条件为真时,返回一个指定的值;当条件为假时,返回另一个指定的值。它允许用户在数据处理中做出决策,从而对数据进行分类或计算。

  1. IF() 函数的格式

IF(logical_test, value_if_true, value_if_false)

  1. 参数解释:

    • logical_test(逻辑测试):这是要进行检查的条件,可以是一个数学比较(例如 A1 > 10)、文本比较(例如 A1 = “合格”)等。该参数是必须的。
    • value_if_true(条件为真时返回的值):当逻辑测试的结果为真时,IF() 函数返回该值。这个值可以是文本、数字、公式或单元格引用。这也是必须的。
    • value_if_false(条件为假时返回的值):当逻辑测试的结果为假时,IF() 函数返回该值。与value_if_true相似,这个值也可以是文本、数字、公式或单元格引用。这同样是必须的。
  2. 示例


=IF(A1 > 10, "大于10", "小于或等于10")

在这个例子中,如果单元格 A1 的值大于 10,则返回 “大于10”;否则返回 “小于或等于10”。

XMATCH():搜索项并返回该区域中该项的相对位置

XMATCH() 函数是 Excel 中用于查找和匹配项目位置的函数。它可以在指定的数组或范围内查找某个值,并返回该值的位置。与传统的 MATCH() 函数相比,XMATCH() 函数提供了更多的功能,例如支持模糊匹配、反向查找等。

  1. XMATCH() 函数的格式

XMATCH(lookup_value, lookup_array, [match_mode], [search_mode])

  1. 参数解释:

    • lookup_value(查找值):

      • 描述:这是用户要查找的值,可以是文本、数字或逻辑值。
      • 类型:可以是单个值或单元格引用。
    • lookup_array(查找数组):

      • 描述:这是要搜索的范围或数组,其中包含需要查找的值。
      • 类型:可以是一个行或一列的单元格范围,也可以是一个数组常量。
    • match_mode(匹配模式,非必需):

      • 描述:这是一个可选参数,用于指定匹配的类型。具体选项包括:
      • 0(默认):精确匹配。
      • -1:匹配小于查找值的下一个值。
      • 1:匹配大于查找值的下一个值。
    • search_mode(搜索模式,非必需):

      • 描述:这是一个可选参数,用于指定搜索的方向。具体选项包括:
      • 1(默认):从第一项到最后一项查找。
      • -1:从最后一项到第一项反向查找。
  2. 示例


=XMATCH("苹果", A1:A10, 0, 1)

在这个示例中:

  • 函数会在范围 A1:A10 中查找 “苹果” 的位置。
  • 使用精确匹配(match_mode 为 0),并从前向后搜索(search_mode 为 1)。
CHOOSE():据索引号从最多 254 个数值中选择一个

CHOOSE() 函数是 Excel 中的一个多用途函数,用于根据给定的索引值从一组值中选择并返回特定的值。它是一种方便的方式来处理不同选项,并可以用于创建动态公式。

  1. CHOOSE() 函数的格式

CHOOSE(index_num, value1, [value2], ...)

  1. 参数解释:

    • index_num(索引编号):

      • 描述:这是一个数字,表示要返回的值在提供的值列表中的位置。索引编号从 1 开始,也就是说 1 表示第一个值,2 表示第二个值,以此类推。
      • 类型:整数。
      • 示例:1(表示返回第一个值)。
    • value1(第一个值):

      • 描述:这是当 index_num 为 1 时要返回的值。它可以是数字、文本、单元格引用或其他公式。
      • 类型:可以是任意类型的数据。
      • 示例:“苹果”(表示选择第一个值为"苹果")。
    • [value2], …(其他值,非必需):

      • 描述:这是可选的多个值。在 index_num 指定的值位置时返回对应的值。可以提供多个值,具体数量没有上限,但至少需要两个值。
      • 类型:与 value1 相同,可以为任意类型的数据。
      • 示例:可以是 “香蕉”,“橙子” 等。
  2. 示例


=CHOOSE(2, "苹果", "香蕉", "橙子")

在这个示例中:

  • 函数返回 “香蕉”,因为 index_num为2表示选择第二个值。
DAYS():返回两个日期之间的天数

DAYS() 函数是 Excel 中用于计算两个日期之间的天数的函数。它的功能是返回从起始日期到结束日期之间的天数差,方便用户进行日期计算和时间管理。

  1. DAYS() 函数的格式

DAYS(end_date, start_date)

  1. 参数解释:

    • end_date(结束日期):
      • 描述:这是计算差值的结束日期,可以是具体的日期值、单元格引用或可以转换为日期的文本字符串。
      • 类型:日期格式。
      • 示例:日期值 “2023-10-01” 或单元格引用 A1(假设 A1 中包含一个日期)。
  • start_date(起始日期):

    • 描述:这是计算差值的起始日期,同样可以是具体的日期值、单元格引用或可以转换为日期的文本字符串。
    • 类型:日期格式。
    • 示例:日期值 “2023-09-01” 或单元格引用 B1(假设 B1 中包含一个日期)。
  1. 示例

=DAYS("2023-10-01", "2023-09-01")

在这个示例中:

  • 函数将返回 30,因为从 “2023-09-01” 到 “2023-10-01” 之间有 30 天的差距。
DATEDIF():计算两个日期之间相隔的天数、月数或年数

DATEDIF()可以根据用户选择的单位(如年、月、天等)返回这两个日期之间的差异,常用于年龄计算、项目持续时间分析等场景。

  1. DATEDIF() 函数的格式

DATEDIF(start_date, end_date, unit)

  1. 参数解释:

    • start_date(起始日期):

      • 描述:这是计算差异的开始日期,可以是日期值、单元格引用或可解析为日期的文本字符串。
      • 类型:日期格式。
      • 示例:日期值 “2020-01-01” 或单元格引用 A1(假设 A1 中包含一个日期)。
    • end_date(结束日期):

      • 描述:这是计算差异的结束日期,可以是日期值、单元格引用或可解析为日期的文本字符串。
      • 类型:日期格式。
      • 示例:日期值 “2023-01-01” 或单元格引用 B1(假设 B1 中包含一个日期)。
    • unit(单位):

      • 描述:这是一个文本字符串,指定要返回的差异的单位。常用单位包括:
      • “Y”:计算整年数。
      • “M”:计算整月数。
      • “D”:计算天数。
      • “MD”:计算结束日期与开始日期之间的天数,但不考虑月份和年份。
      • “YM”:计算结束日期与开始日期之间的月份,忽略年份。
      • “YD”:计算结束日期与开始日期之间的天数,忽略年份。
      • 示例:选择"Y"以返回整年数。
  2. 示例


=DATEDIF("2020-01-01", "2023-01-01", "Y")

在这个示例中:

  • 函数将返回 3,因为从 “2020-01-01” 到 “2023-01-01” 之间有 3 个整年。

通过 DATEDIF() 函数,用户可以灵活地计算日期之间的各种差异,支持多种单位的返回,非常适合进行日期相关的分析和应用。

FIND()/FINDB():在第二个文本串中定位第一个文本串

FIND()和FINDB()函数是Excel中用于查找子字符串位置的函数。它们的主要功能是返回特定字符串在另一个字符串中首次出现的位置。

  1. 功能介绍
  • FIND(): 此函数用于查找一个字符串在另一个字符串中的位置,区分大小写。
  • FINDB(): 此函数与FIND()类似,但主要用于处理字节(尤其是对于双字节字符集如中文)时,返回的结果是字节位置,而不是字符位置。
  1. 格式及参数介绍
  • FIND(find_text, within_text, [start_num])

    • find_text: 要查找的子字符串。
    • within_text: 要在其中查找的字符串。
    • start_num: 可选,指定从哪个字符开始查找(默认为1)。
  • FINDB(find_text, within_text, [start_num])

    • find_text: 要查找的子字符串(字节形式)。
    • within_text: 要在其中查找的字符串(字节形式)。
    • start_num: 可选,指定从哪个字节开始查找(默认为1)。
  1. 不同之处
  • 字符处理: FIND()函数返回的是字符的位置,而FINDB()函数返回的是字节的位置。这意味着在处理一个包含双字节字符(如中文)的字符串时,FIND()可能返回的字符位置与FINDB()返回的字节位置不同。
  • 适用场景: 当需要处理英文或单字节字符时,可以使用FIND();而在处理双字节字符时(如中文),FINDB()更为适合。
INDEX():返回表格或区域中的值或值的引用

INDEX()函数是Excel中的一个强大函数,用于返回指定范围内某个单元格的值或引用。它主要用于根据给定的行号和列号来查找和提取数据,常与其他函数(如MATCH)结合使用,进行动态查找。

  1. 格式及参数介绍
    INDEX函数的基本格式如下:
INDEX(array, row_num, [column_num])
  • array: 必需。要从中返回值的单元格区域或数组。
  • row_num: 必需。指定要返回的值所在的行号。如果array是多行多列的区域,row_num表示指定的行。
  • column_num: 可选。指定要返回的值所在的列号。如果array是单列区域,column_num可以省略。

以上是INDEX()的数组形式。INDEX还有引用形式,格式如下:

INDEX(reference,row_num,[column_num],[area_num])
  • reference:必需。 对一个或多个单元格区域的引用。
    • 如果为引用输入一个不连续的区域,必须将其用括号括起来。
    • 如果引用中的每个区域均只包含一行(或一列),则 row_num(或 column_num)为可选参数。 例如,对于单行的引用,可以使用函数 INDEX(reference,column_num)。
  • row_num:必需。引用中某行的行号,函数从该行返回一个引用。
  • Column_num:可选。引用中某列的列标,函数从该列返回一个引用。
  • area_num:可选。 选择要返回 row_num 和 column_num 的交叉点的引用区域。 选择或输入的第一个区域的编号为 1,第二个的编号为 2,依此类推。如果省略 area_num,则 INDEX 使用区域 1。此处列出的区域必须全部位于一张工作表。如果指定的区域不位于同一个工作表,将导致 #VALUE! 错误;如果需要使用的范围彼此位于不同工作表,建议使用函数 INDEX 的数组形式,并使用其他函数来计算构成数组的范围。例如,可以使用 CHOOSE 函数计算将使用的范围。
  1. 使用案例
    假设有以下数据表格,存放在A1:B4单元格区域:
学生姓名成绩
张三85
李四90
王五78
赵六88

如果你想提取“李四”的成绩,可以使用INDEX函数,方法如下:

=INDEX(B1:B4, 2)

解析:

  • array: B1:B4(成绩列)。
  • row_num: 2(李四在表格中的行号,即第二行)。
  • column_num: 省略,因为我们只是一列。

返回结果为90,即李四的成绩。

如果需要从整个数据区域中提取某个学生的信息,可以结合MATCH函数使用。例如,如果你想根据学生姓名查找成绩,公式可以写成:

=INDEX(B1:B4, MATCH("王五", A1:A4, 0))

解析:

  • MATCH(“王五”, A1:A4, 0)会返回王五在A1:A4区域中的位置,即3(第三行)。
  • 然后,INDEX(B1:B4, 3)返回第3行的成绩,即78。

也可以返回一行或一列:

=INDEX(A1:B4,0,1)

解析:

  • reference:A1:B4(数据所在区域)
  • row_num:0(表示我们需要的是一整列数据)
  • column_num:1(表示我们需要的是第一列数据)

因为一共有四个数据,所以应当选中包括函数所在单元格之内的4x1单元格,并按 Ctrl+Shift+Enter(如果用的是WPS)来让函数正常运行。

这些函数对于已经和各种编程语言打交道的各位来说,肯定是不成问题的;Excel并没有想象的那么难。当然,我在这里给出的也只不过是冰山一角。接下来有关办公软件的笔记,我会给出Excel更细致、更灵活的内容。


落实和完美大概是矛盾的对立面。但为了正常进行任务,先暂时放弃完美的架子,先落实一个初版,对后续的工作更有利,也有助于增强信心哦。在积跬步的过程中,不知不觉就能行千里。

<think>好的,用户现在再次强调Postman的请求没有问题,并且请求头和内容与代码中的致。之前已经给出了些排查步骤,但用户可能仍然遇到500错误,需要进步分析可能的原因。 首先,用户确认了Postman可以成功发送请求,而代码发送时返回500。这说明问题可能出在代码和Postman之间的细微差异上,或者在服务器端的处理上。虽然用户已经检查了XML结构,但还需要考虑其他可能性。 接下来,考虑用户提到的Content-Type设置。用户可能在代码中正确设置了Content-Type,但需要确认是否包含charset=utf-8。另外,BOM头的问题之前提到过,用户是否已经正确使用UTF8Encoding(false)来避免BOM? 然后,用户提供的soapRequest字符串中包含了jsonString变量。这个变量是否有可能包含非法字符,比如控制字符或未正确转义的XML特殊字符?即使之前进行了转义,也可能存在遗漏的情况,特别是如果jsonString中包含用户输入的数据,可能会有不可预见的字符。 另外,HTTP头中的其他部分,如User-Agent或其他自定义头,是否在代码和Postman中存在差异?某些服务器可能对特定的头有依赖,或者对缺失某些头敏感。 还需要考虑请求的编码方式,是否在代码中正确处理了编码问题,比如使用正确的编码方式发送请求体。此外,SSL/TLS设置或者代理设置是否在代码和Postman中不同,导致连接问题? 如果以上都检查无误,可能需要进步抓包对比实际发送的请求内容,确保代码发送的字节流与Postman完全致。可以使用工具如Wireshark或Fiddler来捕获两种请求的原始数据,进行二进制对比,找出潜在的差异。 最后,如果所有客户端检查都通过,问题可能确实在服务器端。服务器可能在处理请求时存在不同的逻辑路径,比如身份验证、会话管理或请求解析的差异,导致内部错误。这时候需要服务器端提供详细的日志来定位问题。</think>--- ### 🔍 **关键矛盾点聚焦** 您已确认 **Postman请求成功** 而代码返回500,但两者内容肉眼致。此时必须怀疑**代码存在肉眼不可见的底层差异**。以下是针对性排查步骤: --- ### 🔥 **致命细节①:编码幽灵字节** #### 问题核心 C#的`StringContent`默认使用**带BOM的UTF8编码**,而Postman默认无BOM。服务端可能因BOM头`EF BB BF`解析失败。 #### 验证方法 修改代码强制去除BOM: ```csharp // 关键修复:使用无BOM的UTF8 var content = new StringContent(soapRequest, new UTF8Encoding(false), "text/xml"); ``` --- ### 🔥 **致命细节②:隐藏控制字符污染** #### 问题场景 `jsonString`中可能包含以下破坏XML的字符: - **ASCII控制字符**:`\x00-\x1F` (除`\t`, `\n`, `\r`) - **未转义特殊字符**:`&`, `<`, `>` 等 #### 终极检测代码 ```csharp // 检测非法控制字符 bool hasInvalidChars = jsonString.Any(c => c < 32 && c != '\t' && c != '\n' && c != '\r' ); // 强制转义XML敏感字符 string sanitizedJson = SecurityElement.Escape(jsonString); ``` --- ### 🔥 **致命细节③:HTTP头顺序陷阱** #### 现象 某些服务端对头顺序敏感。Postman可能自动排序,而代码中头顺序不同。 #### 解决方案 在代码中**显式设置Content-Type**: ```csharp content.Headers.Clear(); content.Headers.TryAddWithoutValidation("Content-Type", "text/xml; charset=utf-8"); ``` --- ### ⚡ **终极验证:二进制对比** #### 操作步骤 1. 在代码中捕获实际发送的**原始字节流**: ```csharp var rawBytes = await content.ReadAsByteArrayAsync(); File.WriteAllBytes("code_request.raw", rawBytes); ``` 2. 从Postman导出成功请求的原始报文(需开启日志记录) 3. 使用**Hex对比工具**(如WinMerge)检查两个文件差异,重点关注: - 文件起始3字节(BOM标记) - 特殊字符编码(如`&`是否被转义为`&`) --- ### 📌 **结论** 若上述修复无效,**唯可能性是服务端存在Bug**。请将对比结果提交服务端开发团队,要求其: 1. 提供接收到的原始报文十六进制dump 2. 检查XML解析器配置(如:是否禁用BOM、是否启用严格模式)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

靈镌sama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值