对于用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. 使用 Spring 2.5 TestContext 测试框架

    Spring 2.5 TestContext 测试框架用于测试基于 Spring 的程序,TestContext 测试框架和低版本 Spring 测试框架没有任何关系,是一个全新的基于注解的测试框架, ...

  2. 解决-bash: fork: retry: Resource temporarily unavailable (修改最大线程数)

    错误提示的本质是Linux操作系统无法创建更多进程,导致出错.因此要解决这个问题需要修改Linux允许创建更多的进程. 方案一: cat /etc/security/limits.conf echo ...

  3. bg和fg命令

    linux提供的fg和bg命令,可以让我们轻松调度正在运行的任务   假如你发现前天运行的一个程序需要很长的时间,但是需要干前天的事情,你就可以用ctrl-z挂起这个程序,然后可以看到系统的提示: [ ...

  4. iscsi initiator端Note

    iscsi initiator端    (1)安装open-scsi      sudo  apt-get install open-iscsi open-iscsi-utils     (2)cha ...

  5. textwrap 模块

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #textwrap 模块 #http://www.cnblogs.com/hongten/p/python_t ...

  6. getpass模块

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #getpass模块 import getpass ''' >>> help(getpass ...

  7. 获取List对象的泛型类(原创)

    群里一个伙计的需求,最后我提出了这种解决方案,不过他觉得多写俩括号增加了调用方的难度.还是先记下来吧,有时间看看还能不能再改造.   1.直接获取时获取不到的,类型被虚拟机擦除了2.利用子类实现父类的 ...

  8. 【vue.js】windows下安装vue.js

    windows下搭建vue开发环境 Vue.js是一套构建用户界面的 “渐进式框架”.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常 ...

  9. cxf之Caused by: java.lang.RuntimeException: Soap 1.1 endpoint already registered on address /rest

    发布rest服务 但是spring-cxf-rest.xml中配置的却是 <jaxws:server address="/weather".................. ...

  10. html导出图片

    有一个神奇的库:html2canvas. 这个库简洁优美,使用方便. 下面先看一个小demo,它需要用到一张图片:haha.jpg. <html> <head> <scr ...