Office Word 2003 使用邮件合并功能实现连续编号备忘

这里做个备忘,主要是工作上偶尔会遇到的一个简单操作,常见的场景是会议资料封面需要编号,或者某某证书有唯一的序列号标识。其实很长一段时间是用打码机手动一张一张打码进行编号,这个工作特别累人,尤其是在文件比较多、任务比较紧的情况下,如何自动让Word根据模板来生成已经编好号的页面成为考虑的首要内容。

对于程序员来说,第一种想法就是编程,通过VBA技术进行脚本编程,替换设定好的模板指定占位符进行批量生成确实可以很好的解决问题,唯一麻烦的地方是如果以后文件有改动,程序需要重新配置,而且授人以鱼不如授之以渔,对于不会编程的同事来说,我还需要教会他们完成这项工作,所以今天文章主要介绍的就是如何不通过编程来实现连续编号。

假设给我们的是一个留下需要输入编号的空白模板文档,在此基础上我们需要新建Excel,文件名自定义。

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(7) 关系

前面介绍了关于用户账户的User表,但是现实生活中随着问题的复杂化数据库存储的数据不可能这么简单,让我们设想有另外一张表,这张表和User有联系,也能够被映射和查询,那么这张表可以存储关联某一账户的任意数量的电子邮件地址。这种联系在数据库理论中是典型的1-N (一对多)关系,用户表某一用户对应N条电子邮件记录。

之前我们的用户表称为users,现在我们再建立一张被称为addresses的表用于存储电子邮件地址,通过Declarative系统,我们可以直接用映射类Address来定义这张表:

>>> from sqlalchemy import ForeignKey
>>> from sqlalchemy.orm import relationship, backref
 
>>> class Address(Base):
...     __tablename__ = 'addresses'
...     id = Column(Integer, primary_key=True)
...     email_address = Column(String, nullable=False)
...     user_id = Column(Integer, ForeignKey('users.id'))
...
...     user = relationship("User", backref=backref('addresses', order_by=id))
...
...     def __init__(self, email_address):
...         self.email_address = email_address
...
...     def __repr__(self):
...         return "〈Address('%s')〉" % self.email_address

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(6) 查询

1. 返回列表和标量(Scalar)

前面我们注意到Query对象可以返回可迭代的值(iterator value),然后我们可以通过for in来查询。不过Query对象的all()one()以及first()方法将返回非迭代值(non-iterator value),比如说all()返回的是一个列表:

>>> query = session.query(User).\
>>>         filter(User.name.like('%ed')).order_by(User.id)
>>> query.all() 
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users
WHERE users.name LIKE ? ORDER BY users.id
('%ed',)
 
[User('ed','Ed Jones', 'f8s7ccs'), User('fred','Fred Flinstone', 'blah')]

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(5) 查询

前期我们做了充足的准备工作,现在该是关键内容之一查询了,当然前面的文章中或多或少的穿插了些有关查询的东西,比如一个查询(Query)对象就是通过Session会话的query()方法获取的,需要注意的是这个方法的参数数目是可变的,也就是说我们可以传入任意多的参数数目,参数的类型可以是任意的类组合或者是类的名称,接下来我们的例子就说明了这一点,我们让Query对象加载了User实例。

>>> for instance in session.query(User).order_by(User.id): 
...     print instance.name, instance.fullname
SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users ORDER BY users.id
()
 
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(4) 添加对象

1. 添加一个新对象

前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中:

ed_user = User('ed', 'Ed Jones', 'edspassword')
session.add(ed_user)

上面两段代码执行完后对象持久化了么?你或许会兴冲冲的跑去数据库里查看,结果却失望而归——数据库里什么都没有。为什么呢?因为SQLAlchemy采取的是Lazyload策略,也就是说现在这个对象被标记为Pending准备状态,但没有执行任何可能导致数据库变化的SQL语句。那么什么时候会执行SQL语句并真正持久化呢?这个要等SQLAlchemy觉得需要的时候,比如我们现在查询这个对象、对象的一个属性或者显式的调用flush方法,这时候SQLAlchemy觉得它“是时候”或者“不得不”执行SQL数据库查询以便于把标记为Pending的数据写入数据库表中了。假如这时候你执行的获取对象、对象属性或者类似的操作,SQLAlchemy在执行完SQL语句后会将你所要查询的数据反馈给你。

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(3) 会话

1. 创建映射类的实例(Instance)

前面介绍了如何将数据库实体表映射到Python类上,下面我们可以创建这个类的一个实例(Instance),我们还是以前一篇文章的User类为例,让我们创建User对象:

>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> ed_user.name
'ed'
>>> ed_user.password
'edspassword'
>>> str(ed_user.id)
'None'

和普通的Python类一样实例化,大家可能会问为什么ed_user.id会是None值,首先id这个属性没有通过__init__()构造方法初始化,所以默认会因为先前定义的ORM的id列(Column)而产生一个None值,在默认情况下,ORM会为所有被映射的表列创建类属性,这些属性是通过Python语言中描述符(Descriptors)机制来实现的。所以这些属性的使用会包含一些额外的行为,包括跟踪修改,或者当需要时自动从数据库加载新的数据,也就是说我们在使用这些属性时,包括修改或者读取,都会触发ORM内部的一系列动作。

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(2) 定义映射

昨天简单介绍了SQLAlchemy的使用,但是没有能够涉及其最精彩的ORM部分,今天我将简单说明一下,当然主要还是讲解官方文档的内容,由于是学习笔记,有可能存在精简或者自己理解的部分,不做权威依据。

当我们开始使用ORM,一种可配置的结构可以用于描述我们的数据库表,稍后我们定义的类将会被映射到这些表上。当然现代的SQLAlchemy(新版本SQLAlchemy,原文是modern SQLAlchemy)使用Declarative把这两件事一起做了,即允许我们把创建类和描述定义数据库表以及它们之间的映射关系一次搞定。

这段话是什么意思呢?简单来说吧,SQLAlchemy分为Classic (经典模式)和Modern (现代模式),Classic定义数据库表的模式比较传统,需要先描述这个表。

1. Classic 映射

比如以官方文档中的例子,我们拥有表结构如下:

CREATE TABLE [users] (
  [id]       INTEGER PRIMARY KEY,
  [name]     TEXT NOT NULL,
  [fullname] TEXT NOT NULL,
  [password] TEXT NOT NULL
);

继续阅读

Python数据库ORM SQLAlchemy 0.7学习笔记(1) 概要

最近正好在寻求一种Python的数据库ORM (Object Relational Mapper),SQLAlchemy (项目主页)这个开源项目进入了我的视线,本来想尝试着使用Django的ORM模块的,无奈Django的模块联系比较紧密,没能单独分拆下来,一定程度上说明Django自成体系的生态系统在给我们带来快速便捷的开发环境的同时牺牲了组装的灵活性。

初次学习,也没实质感觉到SQLAlchemy的好处,不过看其介绍的很多大公司均采用该项目,而且其支持的数据库还是蛮丰富的,所以我觉得花点时间研究还是值得的。不过令人遗憾的是关于SQLAlchemy的中文资料比较少,所以对于我们这种英语不佳的带来了一定的麻烦。

研究一个项目最好的办法就是阅读其官方提供的说明文档,当然很轻松就找到了SQLAlchemy的文档 (0.7)。文档的格式和大多数项目一样,有下载安装说明,有示例,有快速上手教程。不过我还是习惯下载个PDF慢慢研究

下面就将我近期的阅读学习做个笔记,当然这个仅供参考,里面可能有自己的一些猜测和想法,不作权威依据,不当之处还希望指出。

继续阅读

Python 三元条件判断表达式(and or/if else)

之前学习的Python提到了对于类似C语言的三元条件表达式condition ? true_part : false_part,虽然Python没有三目运算符(?:),但也有类似的替代方案,那就是true_part if condition else false_part

>>> 1 if True else 0
1
>>> 1 if False else 0
0
>>> "Fire" if True else "Water"
'Fire'
>>> "Fire" if False else "Water"
'Water'

在编程中我也一直这么用了,直到有一天发现了一个有趣的技巧,那就是and-or技巧,利用条件判断的优先特性来实现三元条件判断,比如P∧Q,在Python中如果P为假,那么Python将不会继续执行Q,而直接判定整个表达式为假(P值),当然如果P为真,那就还要继续执行Q来决定整个表达式值;同样的P∨Q,如果P为真,那么就不会继续执行Q了…

继续阅读

配置基于Debian Linux工作环境备忘

以下内容以笔记备忘为主,可能比较乱,还望见谅,环境是Debian 6系列。

最近正好要将计算机上的工作环境迁移到另外一台电脑上来,下面将配置做个简单的备忘,也供大家参考。

首先以非图形方式安装最新的Debian系统,语言最好选择中文吧,看着顺眼些,当然这也会带来一些问题,比如接下来命令控制台的乱码。不过为了减少安装中文界面的麻烦,还是选择中文,这样GUI桌面安装完毕后将自动为中文界面,同时命令控制台也能恢复中文显示,乱码问题在安装完桌面后自然解决。

还有一点需要需要注意的是,如果希望安装其他桌面系统,比如Xfce;或者希望安装精简的Gnome系统,请在安装步骤中的“软件选择”步骤不要选择“图形桌面环境”。(注:Debian默认安装包自带的Gnome系统是完全版的,包含OpenOffice以及其他可能我们不需要的软件)

好了,经过若干步骤后基本上一个命令行界面的简易Linux是装上了,接下来是命令操作,先将APT源改为国内的,这里我们选择网易163的源,这样接下来安装软件会快得多:

继续阅读