对于用com组件写excel,笔者表示那个太慢了。而且很耗资源,还要装excel。

今天我们就用写文本文件的方式来写excel。

步骤1,用excel写好一个设计一个我们想要的模板。

步骤2,我们把做好的excel模板,另存为。 这时会出现另存为的对话框。在保存类型中选择“XML 电子表格 2003 (*.xml)”。然后名字随便写。

步骤3,把我们刚保存的xml文件用文本打开。我们就会看到,其实excel是以xml方式存放的数据。如果这时你用excel打开那个xml文件,会发现excel出现的就是我们刚才的设计的模板。而且格式和我们设计的一样。

步骤4,所以我们可以用写xml,或者文本的方式写excel,只要符合我们刚才保存的那个xml格式。然后文件的后缀名改成xls就OK了。 而这个写的速度超快。


说完了上面的方法我们用代码把它实现吧。笔者主要编程语言为c#。所以就用c#封装了个写excel的类。代码如下

public class ExcelHelper
{
private Excel.Application oExcel = null;
private Excel.Workbook oBook = null;
private Excel.Worksheet oSheet = null;
private Excel.Range oRange = null;
public ExcelHelper()
{
oExcel = new Excel.Application();
oBook = oExcel.Application.Workbooks.Add(true);
oSheet = (Excel.Worksheet)oBook.ActiveSheet;
}
/// <summary>
/// 向excel写入文本(如向“A1”写入文字:InsertText("A1",要填入的文字))
/// </summary>
/// <param name="val_range">单元格</param>
/// <param name="val_text">文本</param>
public void InsertText(string val_range, string val_text)
{
oRange = oSheet.Range[val_range];
oRange.Value = val_text;
}
/// <summary>
/// 向excel写入文本
/// </summary>
/// <param name="val_range">单元格</param>
/// <param name="val_text">文本</param>
/// <param name="val_fontSize">字体大小</param>
public void InsertText(string val_range, string val_text, float val_fontSize)
{
oRange = oSheet.Range[val_range];
oRange.Value = val_text;
oRange.Font.Size = val_fontSize;
}
/// <summary>
/// 向excel写入文本(如向“B1”写入文字:InsertText(1,2,要填入的文字))
/// </summary>
/// <param name="val_i">行号</param>
/// <param name="val_j">列号</param>
/// <param name="val_text">文本</param>
public void InsertText(int val_i, int val_j, string val_text)
{
oRange = (Excel.Range)oSheet.Cells[val_i, val_j];
oRange.Value = val_text;
}
/// <summary>
/// 向excel写入文本(如向“B1”写入文字:InsertText(1,2,要填入的文字,字体大小))
/// </summary>
/// <param name="val_i">行号</param>
/// <param name="val_j">列号</param>
/// <param name="val_text">文本</param>
/// <param name="val_fontSize">字体大小</param>
public void InsertText(int val_i, int val_j, string val_text, float val_fontSize)
{
oRange = oSheet.Cells[val_i, val_j];
oRange.Value = val_text;
oRange.Font.Size = val_fontSize;
}
/// <summary>
/// 读取excel文本项(如读取“B1”的文字:ReadText("B1"))
/// </summary>
/// <param name="val_range">单元格</param>
/// <returns></returns>
public string ReadText(string val_range)
{
oRange = oSheet.Range[val_range];
return oRange.Text.ToString();
}
/// <summary>
/// 读取excel文本项(如读取“A1”的文字:ReadText(1,1))
/// </summary>
/// <param name="val_i">行号</param>
/// <param name="val_j">列号</param>
/// <returns></returns>
public string ReadText(int val_i, int val_j)
{
oRange = oSheet.Cells[val_i, val_j];
return oRange.Text.ToString();
}
/// <summary>
/// 合并单元格
/// </summary>
/// <param name="x1">行号</param>
/// <param name="y1">列号</param>
/// <param name="x2">行号</param>
/// <param name="y2">列号</param>
public void MerMergeCells(int x1, int y1, int x2, int y2)
{
oSheet.Range[oSheet.Cells[x1, y1], oSheet.Cells[x2, y2]].Merge();
}
/// <summary>
/// 设置excel列的默认样式
/// </summary>
public void SetColumnDefaultStyle()
{
oSheet.Columns.EntireColumn.AutoFit();
oSheet.Columns.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
}
/// <summary>
/// 保存excel文件(如要将excel保存到D:\test.xls:SaveAs)
/// </summary>
/// <param name="val_saveAsFilePath">文件路径</param>
/// <returns></returns>
public bool SaveAs(string val_saveAsFilePath)
{
try
{
oSheet.SaveAs(val_saveAsFilePath);
return true;
}
catch
{
return false;
}
}
public bool Print()
{
try
{
oSheet.PrintOut();
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 自动释放excel资源
/// </summary>
public void Dispose()
{
if (oExcel != null)
{
oExcel.Workbooks.Close();
oExcel.Quit();
KillAllExcel();
oExcel = null;
}
if (oBook != null)
{
oBook = null;
}
if (oSheet != null)
{
oSheet = null;
}
if (oRange != null)
{
oRange = null;
}
GC.Collect();
}
/// <summary>
/// 获取所有excel进程
/// </summary>
/// <returns></returns>
private static List<Process> GetExcelProcesses()
{
Process[] processes = Process.GetProcesses();
List<Process> excelProcesses = new List<Process>();
for (int i = ; i < processes.Length; i++)
{
if (processes[i].ProcessName.ToUpper() == "EXCEL")
excelProcesses.Add(processes[i]);
}
return excelProcesses;
}
/// <summary>
/// 杀死所有Excel进程
/// </summary>
private static void KillAllExcel()
{
List<Process> excelProcesses = GetExcelProcesses();
for (int i = ; i < excelProcesses.Count; i++)
{
excelProcesses[i].Kill();
}
}
/// <summary>
/// DataTable导出Excel
/// </summary>
/// <param name="sFileName"></param>
/// <param name="dt"></param>
public void DataTableToExcel(string fileName, DataTable dt)
{
int CurrentCol = ;//当前列
int RowCount = dt.Rows.Count + ;//总行数
int ColCount = dt.Columns.Count;//总列数
StreamWriter sw = new StreamWriter(fileName, false);//文件如果存在,则自动覆盖
try
{
#region XML头部
sw.WriteLine("<?xml version=\"1.0\"?>");
sw.WriteLine("<?mso-application progid=\"Excel.Sheet\"?>");
sw.WriteLine("<Workbook");
sw.WriteLine("xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
sw.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">");
sw.WriteLine("\t<Styles>");
sw.WriteLine("\t\t<Style ss:ID=\"Default\" ss:Name=\"Normal\"><Alignment ss:Vertical=\"Center\"/><Font ss:FontName=\"宋体\" ss:Size=\"12\"/></Style>");
sw.WriteLine("\t\t<Style ss:ID=\"s47\"><Font ss:FontName=\"宋体\" ss:Size=\"11\" ss:Color=\"#000000\"/><Interior ss:Color=\"#EBF1DE\" ss:Pattern=\"Solid\"/></Style>");
sw.WriteLine("\t\t<Style ss:ID=\"s33\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Double\" ss:Weight=\"3\" ss:Color=\"#3F3F3F\"/></Borders><Font ss:FontName=\"宋体\" ss:Size=\"11\" ss:Color=\"#FFFFFF\" ss:Bold=\"1\"/><Interior ss:Color=\"#A5A5A5\" ss:Pattern=\"Solid\"/></Style>");
sw.WriteLine("\t\t<Style ss:ID=\"s68\" ss:Parent=\"s33\"><Alignment ss:Horizontal=\"Center\" ss:Vertical=\"Center\"/></Style>");
sw.WriteLine("\t\t<Style ss:ID=\"s93\" ss:Parent=\"s47\"><Borders><Border ss:Position=\"Bottom\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Left\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Right\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/><Border ss:Position=\"Top\" ss:LineStyle=\"Continuous\" ss:Weight=\"1\" ss:Color=\"#3F3F3F\"/></Borders></Style>");
sw.WriteLine("\t</Styles>");
sw.WriteLine("\t<Worksheet ss:Name=\"Sheet1\">");
sw.WriteLine("\t\t<Table ss:DefaultColumnWidth=\"150\" ss:DefaultRowHeight=\"20\">");
#endregion #region excel标题
sw.WriteLine("\t\t\t<Row>");
sw.WriteLine("\t\t\t\t<Cell ss:MergeAcross=\"{0}\" ss:StyleID=\"s68\">",ColCount-);
sw.WriteLine("\t\t\t\t\t<Data ss:Type=\"String\">{0}</Data>",dt.TableName);
sw.WriteLine("\t\t\t\t</Cell>");
sw.WriteLine("\t\t\t</Row>");
#endregion #region excel表头信息
sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">");
for (CurrentCol = ; CurrentCol < ColCount; CurrentCol++)
{
sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">{0}</Data></Cell>", dt.Columns[CurrentCol].ColumnName.ToString().Trim());
}
sw.WriteLine("\t\t\t</Row>");
#endregion #region excel表格内容
foreach (DataRow row in dt.Rows)
{
sw.WriteLine("\t\t\t<Row ss:AutoFitHeight=\"0\" ss:Height=\"15\">");
for (CurrentCol = ; CurrentCol < ColCount; CurrentCol++)
{
sw.Write("\t\t\t\t<Cell ss:StyleID=\"s93\"><Data ss:Type=\"String\">");
if (row[CurrentCol] != null)
{
sw.Write(row[CurrentCol].ToString().Trim());
}
else
{
sw.Write("");
}
sw.Write("</Data></Cell>");
}
sw.WriteLine("\t\t\t</Row>");
}
#endregion #region XML尾部
sw.WriteLine("\t\t</Table>");
sw.WriteLine("\t</Worksheet>");
sw.WriteLine("</Workbook>");
#endregion
}
catch
{ }
finally
{
sw.Close();
sw = null;
}
}
}

快速写excel的方法的更多相关文章

  1. HTML5快速写页面的方法

    1 如果有原型的HTML页面(Axure导出来),可以在此从F12的“查看器”基础上拷贝到一个新文件,继续写代码. 2 利用EditPlus软件的工具 3 使用Dreamweaver CS5,可以直观 ...

  2. 快速写一个babel插件

    es6/7/8的出现,给我们带来了很多方便,但是浏览器并不怎么支持,目前chrome应该是支持率最高的,所以为了兼容我们只能把代码转成es5,这应该算是我们最初使用babel的一个缘由,随着业务的开发 ...

  3. IDEA最常用快捷键汇总+快速写出Main函数

    IDEA可以说是当下Java程序员日常开发的神器,但是想要发挥这款神器的牛逼威力,必须得熟练使用它的各种快捷键才行.本篇总结下使用IDEA(也就是IntelliJ IDEA )进行日常开发中最常用的快 ...

  4. 实战-DRF快速写接口(认证权限频率)

    实战-DRF快速写接口 开发环境 Python3.6 Pycharm专业版2021.2.3 Sqlite3 Django 2.2 djangorestframework3.13 测试工具 Postma ...

  5. MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult

    导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...

  6. HTML Table导出为Excel的方法

    HTML Table导出为Excel的方法: 直接上源码 <html> <head> <meta http-equiv="Content-Type" ...

  7. VBS操作Excel常见方法

    VBS操作Excel常见方法 作者: 字体:[增加 减小] 类型:转载 时间:2009-11-13我要评论 VBS控制Excel常见方法,需要的朋友可以参考下. dim oExcel,oWb,oShe ...

  8. asp.net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

  9. ASP.NET导出excel表方法汇总

    asp.net里导出excel表方法汇总  1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...

随机推荐

  1. PHPCMS V9 加密规则

    PHPCMS V9 加密规则 相关表:v9_admin 加密方式: md5(md5(password)+encrypt) 第一步:对输入的密码32位小写   MD5 对输入的密码进行trim过滤 第二 ...

  2. 设计模式之适配器模式(Adapter Pattern)C++实现

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这样的类型的设计模式属于结构型模式.它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口.适配器 ...

  3. java数组转json

    public String toJsonObject(String[] list) { String json="["; for (int i=0;i<list.length ...

  4. SoapUI 测试接口演示

      SoapUI 测试接口演示 CreateTime--2018年4月2日15:54:05 Author:Marydon 以webservice为例 1.安装:  SoapUI-x64-5.4.0-E ...

  5. [TODO]com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method

    异常信息如下: 2018-10-30 20:00:50.230 ERROR java.util.concurrent.ExecutionException: com.alibaba.dubbo.rpc ...

  6. webservice系统学习笔记8-简单的权限校验

    服务端handler.java package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import jav ...

  7. Oracle EBS WMS功能介绍(二)

    Oracle EBS WMS功能介绍(二) (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处.否则请与本人联系,违者必究) 出货物流逻辑主要包括 1.      打包.能够进 ...

  8. Centos5 下redmine的安装及配置

    Redmine: 这是基于ROR框架开发的一套跨平台项目管理系统,是项目管理系统的后起之秀,据说是源于Basecamp的ror版而来,支持多种数据库,除了和 DotProject的功能大致相当外,还有 ...

  9. HDUOJ---1879 继续畅通工程

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  10. [转]TCP(HTTP)长连接和短连接区别和怎样维护长连接

    原文链接 一.HTTP协议和TCP协议 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题, ...