Excel 实现相同项目自动合并单元格

我们知道在Excel 中使用合并单元格是大忌,因为这会导致很多自动化的功能实现起来很复杂。
可是现实状况却是,我们往往要按照公司习惯或系统要求来对数据进行合并单元格处理。如果数据只有几十或几百比,尚可通过细心一步步去完成,那如果数量上升一个量级呢?!

最近,我遇到一个合并单元格的需求。需要实现的效果是这样的:
Excel 实现相同项目自动合并单元格

原始数据是这样的:

Excel 实现相同项目自动合并单元格

下面我们一步步来实现这种效果。

第一步 对数据进行排序

让相同的项目集中在一起,好实现后面的合并单元格。
Excel 实现相同项目自动合并单元格

第二步 添加辅助列1

辅助列1,让相同的项目拥有相同的编号。

C2输入数字1,在C3单元格中使用公式:=IF(A3=A2,C2,C2+1),填充C列区域所有行。
Excel 实现相同项目自动合并单元格

第三步 添加辅助列2

对辅助列1进行求2的余数,在D2输入公式:=MOD(C2,2),这样会把D列分成两种类型0或1。我们要实现的最终结果就是把相同数字的单元格合并成一个。

Excel 实现相同项目自动合并单元格

第四步 添加辅助列3

辅助列3要把一种数字替换成任何文字,用于分成数字或文字两种类型。
在E2单元格输入公式:=IF(D2=1,"文字",D2)

Excel 实现相同项目自动合并单元格

第五步 格式刷实现效果

我们选中E列,快捷键Ctrl+G 打开定位窗口,点击定位条件按钮,设置定位文本。

Excel 实现相同项目自动合并单元格

这样会选中E列所有是文本的单元格。
然后,右键合并单元格:
Excel 实现相同项目自动合并单元格Excel 实现相同项目自动合并单元格
到此,已经实现了所有文本单元格的合并。重复上面的步骤,定位的内容换成数字,同样会把包含数字的相邻单元格合并。
Excel 实现相同项目自动合并单元格
上面显示的这种效果,就是我们希望在A列实现的效果。
直接使用格式刷把A列刷成E列的效果。
最终,完成!效果如下:
Excel 实现相同项目自动合并单元格

斑马标签打印机设置

最近在客户这里使用Zebra 110Xi4 600 dpi标签打印机时遇到了三个问题:

①. 笔记本无法连接到打印机。
②. 打印机无法识别标签大小,走纸错误。
③. 需要打印有规律的数百个序列号,如何使用函数自动生成。

笔记本连接打印机

通常情况下通过USB端口连接打印机后笔记本会自动安装驱动程序,可是不知为什么这种方式安装的驱动无法使用。

尝试下载过很多驱动程序依然无法使用,包括安装ZebraDesigner Pro设计软件提供的驱动程序依然无效。

最后在老师傅的帮助下解决了。

解决方式:断开USB连接,在计算机→开始→设备和打印机中删除所有的打印机。

此时需要注意,有打印任务挂起的打印机需先取消打印任务才能删除。

斑马标签打印机设置

删除完成重新添加打印机,选择USB虚拟打印机接口。

斑马标签打印机设置

下一步,选择相应的打印机厂商和对应的型号。这里打印机类型选择ZDesigner,打印机选择Zebra 110Xi4 600 dpi最新版的驱动。
斑马标签打印机设置

驱动安装完成即可。

打印机识别标签大小

标签的样式千差万别,斑马打印机默认提供了校准的功能,可用来自动识别并设置打印机,可识别:
* 介质长度
* 介质类型(连续或间断)
* 打印方法(热敏或热转印)
* 传感器值

我们这里主要让打印机识别标签的样式,需要执行长校准。
执行步骤如下:
* 按控制面板上的PAUSE (暂停)
键,将打印机暂停,然后按
CALIBRATE (校准)。

斑马标签打印机设置

ZebraDesigner使用函数自动生成条码

当我们需要打印成百上千个不同标签的时候,一个个去输入很不切实际。这个时候需要专业的条码设计软件来完成,很多公司都在使用 Codesoft ,不过试用了几次设计和输出总是差异太大,我想肯定是技术不到家。
这里介绍 ZebraDesigner 设计软件,在之前工作的公司使用过比较容易。

据说买斑马打印机附带光盘中会包含此软件,当然,我是在网上下载的。

可以通过连接数据库、添加字段函数或计数器来生成有一定规律的条码。
这里是使用计数器:
斑马标签打印机设置
文本和条形码都可以添加计数器:
斑马标签打印机设置
计数器使用比较简单:设定起始值、打印提示数量(打印到某个数之后暂停等待确认)、最大位数、递增或递减规律
斑马标签打印机设置
同时可以设置计数器的步进间隔和其实循环数量。
斑马标签打印机设置
增加前缀和后缀是比较重要的功能,一般的规律型条码都可以通过前缀+计数器+后缀来实现。
斑马标签打印机设置
设计完成,可以预览符合规律的第一个条码。
斑马标签打印机设置
ZebraDesigner的功能不仅仅限于条形码,其他的GS1码、二维码等等都能设计。
斑马标签打印机设置

打印机问题列表

  1. Windows 删除打印机并重新添加,错误提示:另一台打印机或与该打印机同名的打印机已经存在。请为该打印机使用其他名称。
  • 删除打印机后,还要删除注册表里面对应的打印:
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSetoo1\Control\Print\Printers
    然后,重启电脑。

更新时间:2016-7-7 11:55:34

SQL Server报表生成器入门

最近几周都在客户公司做项目,偶然的机会看到他们的主管在教怎么使用SQL Server报表生成器快速创建所需报表。感觉很有趣、很强大,于是跟着学了一些。

网上下载了:Microsoft SQL Server 2014 Report Builder 3.0,竟然是免费软件!

下面记录一下创建一个简单的报表流程:

初次使用

初次打开会弹出新建报表向导,默认提供了三种创建模式。

SQL Server报表生成器入门

在这里我们直接双击表或矩阵向导

SQL Server报表生成器入门

选择创建数据集。

SQL Server报表生成器入门

在数据源中可以创建新的数据连接。

SQL Server报表生成器入门

这里我们使用Microsoft SQL Server数据类型。

SQL Server报表生成器入门

输入服务器名,数据库用户验证信息及选择需要查询的数据库。

SQL Server报表生成器入门

创建完成可以同步测试连接效果。

SQL Server报表生成器入门SQL Server报表生成器入门

在设计查询部分,我们可以选择自己输入SQL 语言。
SQL Server报表生成器入门SQL Server报表生成器入门SQL Server报表生成器入门

这里我们选择所有字段的值。

SQL Server报表生成器入门SQL Server报表生成器入门

样式的部分随便选择。

SQL Server报表生成器入门SQL Server报表生成器入门SQL Server报表生成器入门

马克飞象桌面客户端与离线Chrome APP内存占用对比

马克飞象桌面客户端与离线Chrome APP内存占用对比

平时多用马克飞象来记录一些东西,作为支持 Markdown 语法的轻量级印象笔记客户端,它的简洁美观、启动速度快和功能相对完善,让人印象深刻。试用之后就买了79元/年的会员服务。

马克飞象有两种客户端:一种是独立桌面客户端;另一种是基于 Chrome 的应用程序,同样可以独立使用。

之前一直使用基于Chrome 的应用程序。昨天在重装 Windows 10 及 Visual Studio 2015 的过程中,因为要频繁的查看一些教程和记录一些数据,导致马克飞象多次出现卡顿的状况。于是,又安装了另一种独立桌面客户端,对比其内存的占用状况,选择最优的方案。

内存占用对比

  1. 基于 Chrome 的应用程序,在任务管理器中显示为 Google Chrome,未打开 Chrome 浏览器,全部是应用程序占用。

内存占用:38.9MB

马克飞象桌面客户端与离线Chrome APP内存占用对比

  1. 独立桌面客户端

内存占用:26.8MB

马克飞象桌面客户端与离线Chrome APP内存占用对比

总结

对比之后,果断选择使用独立桌面客户端!

C#语言的特殊语法

委托 delegate

  1. 委托(delegate)是对函数原型的包装,相当于函数指针,是引用类型
    • ① 委托的声明:public delegate double MyDelegate(double x);
    • ② 委托的实例化:MyDelegate d2=new MyDelegate(obj.myMethod);
    • ③ 委托的调用:委托变量名(参数列表),如 d2(8.9)
  2. 委托的合并,又称多播 MultiCastDelegate
    • ① 一个委托实例中可以“包含”多个函数
    • ② 调用委托,就是调用其中多个函数
    • ③ 多个函数间的先后顺序是没有意义的,返回值也就没有太多意义
    • ④ 运算符 +-、+=、-=,动态地增减其中的函数,提高程序的灵活性

事件 event

  1. 事件(event)相当于回调函数
    • ① 事件的声明 public event 委托名 事件名;
    • ② 事件的注册于移除:事件名 += 或 -= (在事件所在类的外面,只能用以上两个运算符)
    • ③ 事件的发生:事件名(参数列表),相当于回调所注册的函数
  2. 用户界面中的事件实例:按钮点击事件
this.button1.Click += new System.EventHandler(this.button1_Click);

private void button1_Click(object sender,EventArgs e)
{
    this.label1.Text =DateTime.Now.ToString();
}
  1. 定义及使用事件的6步曲

    • ① 声明事件参数类:class xxxEventArgs{}
    • ② 声明委托:delegate void xxxEventHandler(obj,args)
    • ③ 定义事件:public event 类型 名称
    • ④ 发生事件:事件名(参数)
    • ⑤ 定义一个方法:void 方法名(obj,args)
    • ⑥ 注册事件:xxx.事件 += new 委托(方法名)
  2. 泛型(Generic)

List<Book> books = new List<Book>();
Book book = books[0];

  1. 匿名方法
    • ① 声明方法:delegate(参数){方法体}
    • ② 可以当成一个匿名方法:new Thread(new ThreadStart(delegate(){...}));
    • ③ 可以被隐式转换为一个兼容的委托类型:new Thread(delegate(){...});
  2. Lambda 表达式,相当于匿名方法的简写
    • 省略 delegate ,甚至省略参数类型
    • 直接用(参数)=>{语句或表达式}
    • 示例:
      • button1.Click += (sender,e)=>{...}
      • new Thread(()=>{...}).Start();
      • PlotFun(x=x*x, 0, 100);
  3. Linq (Language Integrated Query)

常见形式:

from c in customers where c.Age>10 orderby c.Name select new {c.Name, c.Phone}

使用示例:

using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {

        int[] arr = new int[] { 8, 5, 89, 3, 56, 4, 1, 58 };

        var m = from n in arr where n < 5 orderby n select n*n;

        foreach (var n in m)
        {
            Console.WriteLine(n);
        }
        Console.Read();
    }
}

总结:匿名函数使用 delegate;Lambda 表达式使用 => ;Linq 使用 from,where,select

C#语言概述

  1. C#之父:Anders Hejlsberg
  2. C#历程图示:

C#语言概述

  1. 架构、语言、工具:

C#语言概述

  1. 统一的编程API:NET Framework类库

C#语言概述

  1. 公共语言运行时(CLR,Common Language Runtime),相当于Java中的虚拟机。设计目标:简化开发、简化应用程序部署、基类库、支持多种语言。
  2. C#程序编译和执行的过程图示:

C#语言概述

  1. exe文件中的内容:IL指令(Intermediate Language)、元信息
  2. 反编译工具:ildasm.exe
  3. 文件扩展名:

    程序文件 .cs
    工程文件 .csproj
    解决方案 .sln

  4. 面向对象程序核心概念:

对象:

属性(property):
如:label1.Textthis.BackColor
方法(method):
如:xxxx.SetBounds(x,y,w,h);MessageBox.Show("hello");
时间(event):
如:Click
this.button1.Click += new System.EventHandler(this.button1_Click);

  1. 使用导入

using System.Windows.Forms;

命名空间

namespace xxxxx{...}

继承

public class Form1 : System.Windows.Forms.Form

自动生成的代码

对象的生成(new),事件的注册(+=)

程序示例:

using System;
class HelloWorld {
    //C#调用 Main() 作为程序的开始
    public static void Main(){
        Console.WriteLine("Hello World.");
    }
}

C#程序设计的方法论:面向对象

  1. 现实中的事物抽象为类(class),基本要素:字段(field)也即变量;方法(method)也即函数。
  2. 构造方法(constructor):主要作用是完成对象的初始化工作。

– ① 构造方法的方法名与类名相同;
– ② 构造函数没有返回类型,也不能写 void。
– ③ 如果用户没有自定义任何构造方法,则系统会自动产生一个 public Person(){}

  1. 对象的创建:构造方法不能显示地直接调用,而是使用 new 来调用。
  2. this的使用:

– ① 指这个对象本身
– ② 常用于访问这个对象的字段及方法(VS 会智能提示)
– ③ 用于区分字段与局部变量
– ④ 用于构造方法调用另一个构造方法,如 public Person():this(0,""){}

  1. 属性(property)的书写:
private string _name;

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

可简写为:

public string Name{set;get;}
  1. 属性与字段的比较:

– ① 属性实际上是方法;
– ② 可以只读或只写:只有 get 或 set
– ③ 可以进行有效性检查:if …
– ④ 可以计算得到的数据
– ⑤ 可以定义抽象属性

  1. 索引器(Indexer)
修饰符 类型名 this[参数列表]
{
    set
    {
    }
    get
    {
    }
}
  1. 属性与索引的比较:
属性 索引器
通过名称标识 通过参数列表进行标识
通过简单名称来访问 通过[ ]运算符来访问
可以用 static 修饰 不能用 static 修饰
属性的 get 访问器没有参数 索引的 get 访问器具有与索引相同的参数列表
属性的 set 访问器包含隐式 value 参数 除了 value 参数外,索引的 set 访问器还具有与索引相同的参数列表
可以继承 可以继承
  1. 使用继承(inheritance)
  • 继承窗体示例:public class Form1:System.Windows.Forms.Form
  • 子类 subclass、父类 baseclass
  • C#中采用单继承
  • 所有的类都是通过直接或间接地继承 object(即 System.Object)得到的。如:class SubClass:BaseClass{}
  • 子类自动地从父类那里继承所有的字段、方法、属性、索引器等成员作为自己的成员
  • 除了继承父类的成员外,子类还可以添加新的成员,隐藏或修改父类的成员。
  1. 继承中与父类同名的方法处理:

– ① 定义同名、但参数列表(签名)与父类不同的方法,这称为对父类方法的重载(Overloading)
– ② 定义同名且参数列表也与父类相同的方法,这称为新增加一种方法,用 new 表示
– ③ 定义同名且参数列表也与父类相同的方法,而且父类的方法用了 abstract 或 virtual 进行了修饰,子类的同名方法用了 override 进行了修饰,这称为虚方法的覆盖(Overriding)

  1. 常用运算符:
    as 运算符

    • 示例:Student s3 = p1 as Student;

– as 只能针对引用型变量
– 如果不能转换,as 运算不会引起异常,只是值为 null

② **is 运算符**

– 示例:if(p is Person)
– 判断一个对象是不是某个类(及其子类)的实例

③ **typeof() 运算符**

– 示例:Type t = typeof(变量);Type t = typeof(类名);
– 获得其运行时的类型

  1. 访问控制符列表
    C#程序设计的方法论:面向对象
  2. static 控制符详解:
    • static 的字段、方法、属性是属于整个类的
    • static 方法中,不能访问实例变量
    • 调用 static 方法时,直接用类名访问
    • static 变量可以用来表示“全局变量”
    • 类名使用 static 来修饰,其内字段、方法全为 static
    • static 构造方法只会调用一次,但其调用时间是不确定的
  3. const 相当于静态常量,只能用于基本类型及 string。如 Math.PI;readonly 相当于不可改量,只能修饰字段,在构造方法中赋值或者在声明时就赋值,只能赋一次值。
  4. 其他类:
    • sealed 类不可继承,如 String、Console、Math、Convert、Graphics、Font等
    • abstract 类不可实例化(new),是抽象的,如 Array、RandomNumberGenerator
  5. 接口(interface)相当于抽象类,一个抽象成员的集合。如 ICloneable、IComparacle、IConvertible、IDisposable、IFormattable、IEnumerable
  6. 定义一个接口
public interface IStringList
{
    void Add(string s);
    int Count{get;}
    string this[int index]{get;set;}
}

public abstract这两个关键词不加。

  1. 实现接口
class 类名:[父类,]接口,接口,...,接口
{
    ...
}
  1. 显示接口成员实现:
    • 方法名前写接口名:void IWindow.Close(){...}
    • 调用时,只能用接口调用:((IWindow)f).Close();
    • 在不同接口的方法相同时,能消除歧义
  2. 结构(struct)实现方式:
struct 结构名 [: 接口名]
{
    ...
}

结构是隐式 sealed ;因此它们不能被继承。

  1. 使用 struct 注意列表:
    • struct 是值类型
    • 结构不能包含无参数构造方法
    • 每个字段在定义时,不能给初始值
    • 构造方法中,必须对每个字段进行赋值
    • 实例化时,使用 new,值类型变量在赋值时,实行的是字段的 copy
  2. 枚举(enum)声明及使用:
enum MyColor
{
    Red,
    Green = 1,
    Blue = 2
}
MyColor c = MyColor.Red;
  1. 面向对象(Object Oriented)的三大特点:
    • 继承 inheritance
      • 子类继承父类的成员、还可增加、调用、隐藏
      • 提高软件模块的可重用性和可扩充性
    • 封装 encapsulation
      • 使用接口,而不关心具体的类
      • 使用属性,而将字段设为 private
    • 多态 polymorphism
      • 相同的方法,不同的参数
      • 自动调用子类相应的方法

C#程序处理流程:顺序、分支与循环

 

  1. 变量命名规则:
  • 不能是C#关键字。
  • 由字母、数字、下划线构成。
  • 第一个字符必须是字母或下划线。
  • 不要太长,一般不超过31个字符为宜。
  • 变量名最好不要与库函数名、类名相同。
  1. C#数据类型分为:值类型(Value Type)和引用类型(Reference Type);值类型存储在栈中,引用类型栈中仅存储引用变量,对象存储在堆中。

详细可划分:

C#程序处理流程:顺序、分支与循环

①、 整数类型:
有符号 sbyte short int long
无符号 byte ushort uint ulong
字符类型 char,如:'a' (使用单引号)
②、 实数类型:
float 如 3.14F
double 如3.14D(默认为 double 类型,即 D 省略)

  • C# 采用 Unicode 编码,每个字符占两个字节,可是使用十六进制编码形式表示字符:char c1 = '\u0061'
  • 当有不同种类混合运算时:int -> long -> float -> double,所有的 byte,short,char 等转换为 int

③、 十进制类型:
Decimal 如 120.5M
④、 布尔类型:
bool 如 true false(必须为小写)
⑤、 字符串类型:

  • 是引用类型,字符串常量会有特殊处理
  • 使用双引号表示,如 "abcd1234"
  • @符号内不用\转义,可以换行。如 @"abcd\rqee"

⑥、推断类型:
在编译时确定,如:var a=1+2;

⑦、Nullable 类型:
如:int? a = 32;
查看是否有值:if(a.HasValue)...

⑧、Dynamic 类型:
由DLR支持,如:dynamic x = new Cell();
编译时不检查,运行时才确定, 主要用于与 COM 组件或其他语言交互

  1. 等价关系

– int 相当于 System.Int32
– double 相当于 System.Double
– bool 相当于 System.Boolean
– string 相当于 System.String(如果使用 using System,则 string 相当于 String)

  1. 转义符:

\uxxxx 1 到 4 位十六进制数所表示的字符
\' 单引号字符
\" 双引号字符
\\ 反斜杠字符
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格

  1. 运算符
    算术运算符 +, -, *, /, %, ++, —
    > – + 还可用于字符串连接,如 string s="hello"+"world!";
    > – + 运算符两侧的操作数只要有一个是字符串类型,系统自动将另一个操作数转换成字符串进行连接,如 string s="hello,"+300;输出:hello,300

关系运算符 >, <, >=, <=, ==, !=
逻辑运算符 !, &, |, ^, &&, ||

  • 短路逻辑运算符 && 第一个操作数为假则不判断第二个操作数
  • || 第一个操作数为真则不判断第二个操作数

位运算符 &, |, ^, ~, >>, <<
赋值运算符 =, +=, -=, *=, /=
条件运算符 z?a:b

  1. 运算符优先级与结合性

C#程序处理流程:顺序、分支与循环

  1. 跳转语句:
    break 语句 结束当前循环
    continue 语句 进入下一次循环
    goto 语句 跳转到某个语句标号
    try{}catch{}语句 异常的捕获
  2. 声明数组时不能指定其长度;C#中多维数组不必须是规则矩阵形式

工具、习惯与生活

关于工具最近想通了一个道理:好的工具能更容易养成好的习惯,从而带来更加舒适的生活。

讲两件自己身上发生的两件事来佐证。

财务管理

这里所说的财务主要是针对人民币和银行卡之类的东西。

在财务管理这方面我有个特别不好的习惯–特随意。随意到什么程度呢,我从来不知道自己兜里有多少钱,人民币也从不关心放在哪,几乎家里每个地方都有钱的影子,衣服口袋、桌子、抽屉或床底下随处都能找到五角一块的。

继续阅读“工具、习惯与生活”

Total Commander使用手册

Total Commander 是我在工作中使用最频繁的一款软件。它的强大无与伦比,堪称神器中的神器!不过要很好的使用它,必须掌握如下的快捷键和设置方式。当然,这是根据我的爱好设定的,您可以自由更换成自己喜欢的方式。

Total Commander 常用快捷键及设置方式:

优先级 快捷键 命令 修改wincmd.ini[Shortcuts]
1 Ctrl+D 开始菜单
2 Ctrl+B 无层级显示文件与文件夹/恢复层级显示
3 Ctrl+Q 另一侧预览选中文件
4 F2 重命名文件 F2=cm_RenameOnly
5 Ctrl+F 搜索文件 C+F=cm_SearchFor
6 Tab 左右窗口间焦点互移
7 F3 预览文件
8 F4 编辑文件
9 F5 复制文件
10 F6 移动文件
11 F7 新建文件夹
12 Shift+F4 新建文本文件并跳转到编辑器中打开
13 Alt+F1/F2 左/右侧选择磁盘
14 Alt+F5 压缩文件
15 Alt+F6 解压文件 A+F6=cm_UnpackFiles
16 Ctrl+w 关闭当前窗口
17 F11 复制文件名到剪贴板 F11=cm_CopyNamesToClip
18 F12 复制文件完整路径名称 F12=cm_CopyFullNamesToClip
19 Alt+D 编辑路径 A+D=cm_EditPath
20 Ctrl+Z 编辑文件的备注
21 Ctrl+\ 切换到根目录
22 Alt+F8 打开FTP界面 A+F8=cm_FtpConnect

Total Commander 常用环境变量:

  • %Commander_path% 代表Total Commander的安装路径

此变量非常有用,比如插件的安装路径是以绝对路径的方式存储在wincmd.ini中,如果移动totalcmd 安装文件夹路径会导致插件失效。

此时可修改wincmd.ini 插件路径参数如下:

Total Commander使用手册

Total Commander 安装插件方法:

插件下载地址:https://www.ghisler.com/plugins.htm
下载的插件为zip压缩包。
在Total Commander中打开压缩包弹出是否安装插件提醒:

Total Commander使用手册

点击“是”,插件的安装过程其实就是在软件根目录下创建plugins文件夹,同时增加插件配置文件:

Total Commander使用手册

指定使用软件文件夹下的配置文件(绿色化软件)

在安装文件夹下的 wincmd.ini 中 [Configuration] 一节增加

UseIniInProgramDir=7

提醒事项:

指向桌面的开始菜单有两种方式:cd C:\Users\%USERNAME%\Desktop 和 cm_OpenDesktop ,推荐使用前一种方式。后一种方式会影响窗口间的文件移动。


参考:
【C学堂】第2讲:TC基本功:定位与选择


更新说明:

  • 2017年6月9日 增加指定ini配置文件路径,优化排版
  • 2017年2月15日 重写已有内容,增加插件安装部分。
  • 2016年4月22日 增进新建文本文件快捷键。
  • 2015年11月28日 增进系统变量环节及搜索快捷键、FTP快捷键。
  • 2015年11月15日 增进Ctrl+z快捷键说明和Ctrl+\快捷键说明。