Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts in 2014.1


浅谈Excel开发:十一 针对64位Excel的插件的开发和部署

自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集。 随着64位操作系统的安装,Office 2010及以上版本的普及以及计算机的内存容量越来越高,使用64位Excel的用户越来越多,所以让插件支持64位Excel能够赢得一部分用户。前面十篇文章中所讲解的技术适用于不同版本和不同位数的Excel,但是由于32位的COM组件不支持64位的Excel,所以在针对不同位数的Excel的编译和部署的时候,有些地方可能需要注意和有所不同。 64位版本的Office只能安装在64位的操作系统之上,32位的Office采用Windows-32-on-Windows-64 (WOW64) 技术可以安装在64位操作系统上,这也是32位Office在64位操作系统上的默认安装 …

Excel Development VSTO Shared Add-in

浅谈算法和数据结构: 三 合并排序

合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序。合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并。 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的。他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。他的唯一缺点是,需要利用额外的N的空间来进行排序。 一 原理 合并排序依赖于合并操作,即将两个已经排序的序列合并成一个序列,具体的过程如下: 申请空间,使其大小为两个已经排序序列之和,然后将待排序数组复制到该数组中。 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较复制数组中两个指针所指向的元素,选择相对小的元素放入到原始待排序数组中,并移动指针到下一位置 重复步骤3直到某一指 …

Merge Sort Algorithm

浅谈算法和数据结构: 二 基本排序算法

本篇开始学习排序算法。排序与我们日常生活中息息相关,比如,我们要从电话簿中找到某个联系人首先会按照姓氏排序、买火车票会按照出发时间或者时长排序、买东西会按照销量或者好评度排序、查找文件会按照修改时间排序等等。在计算机程序设计中,排序和查找也是最基本的算法,很多其他的算法都是以排序算法为基础,在一般的数据处理或分析中,通常第一步就是进行排序,比如说二分查找,首先要对数据进行排序。在Donald Knuth 的计算机程序设计的艺术这四卷书中,有一卷是专门介绍排序和查找的。 排序的算法有很多,在维基百科上有这么一个分类,另外大家有兴趣也可以直接上维基百科上看相关算法,本文也参考了上面的内容。 首先来看比较简单的选择排序(Selection sort),插入排序(Insertion sort),然后在分析插入排序的特征和缺点的基础上,介绍在插入排序基础上改进的希尔排序(Shell …

Selection Sort Shell Sort Insertion Sort

浅谈算法和数据结构: 一 栈和队列

最近晚上在家里看Algorithems,4th Edition,我买的英文版,觉得这本书写的比较浅显易懂,而且“图码并茂”,趁着这次机会打算好好学习做做笔记,这样也会印象深刻,这也是写这一系列文章的原因。另外普林斯顿大学在Coursera 上也有这本书同步的公开课,还有另外一门算法分析课,这门课程的作者也是这本书的作者,两门课都挺不错的。 计算机程序离不开算法和数据结构,本文简单介绍栈(Stack)和队列(Queue)的实现,.NET中与之相关的数据结构,典型应用等,希望能加深自己对这两个简单数据结构的理解。 1. 基本概念 概念很简单,栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构,而队列(Queue)则是一种先进先出 (fisrt in first out,FIFO)的结构,如下图: 2. 实现 现在来看如何实现以上 …


浅谈Excel开发:十 Excel 开发中与线程相关的若干问题

采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互。这其中会存在一些问题,这些问题如果处理不好,通常会导致在运行的时候会抛出难以调试的COM异常,从而导致我们开发出的Excel插件的不稳定。 和普通的WinForm程序一样,Excel也是一种STA(Single Thread Apartment)线程的应用程序,Excel插件是寄宿在Excel中运行的,这也就意味着插件也是一种STA线程的应用程序。插件在操作Excel的时候,如果是在Excel的主线程中,可以直接获取Excel对象进行操作,比如写入单元格值,对单元格进行格式化等操作。但是通常,我们会在多线程或者后台工作线程中去处理一系列复杂的数据或者逻辑,待处理完成获得结果 …

Excel STA COM Exception SynchronizationContext Excel Development

Word文档合并的一种实现

今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多。这个问题,如果是在服务端的话,直接使用OpenXML技术,读写文档就可以实现,这样性能较稳定,但是需要对OpenXML有一定的了解。如果在客户端机器上,可以使用Word PIA实现。 由于本人对于Word PIA较熟悉,所以采用了该方法。但是在实现的过程中,也是有很多种思路的。 将b.doc打开,将其中的内容选中,复制到剪贴板,然后打开目标文件a.doc,通过代码将光标移到文档末尾,粘贴。粘贴一次保存一下文件,然后在打开c.doc重复以上过程,知道所有文件均添加完成。 将b.doc打开,将其中的内容选中,获取Range对象,然后打开目标文件a.doc,在里面通过代码插入b的内容。 以上两种方法都涉及 …