对于用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. 20个常用java代码段

    下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric strin ...

  2. iOS 事件传递及响应过程

    iOS 事件传递及响应过程 -->>事件到来-->>事件分发 -->>事件响应 事件( Events) 官方文档( Events(iOS)) 是这样描写叙述的: U ...

  3. springmvc自己定义拦截器

    Spring MVC也能够使用拦截器对请求进行拦截处理,用户能够自己定义拦截器来实现特定的功能,自己定义的拦截器必须实现HandlerInterceptor接口. 直接看下样例: package co ...

  4. 微信小程序项目实战之天气预报

    概述 微信小程序项目实战之天气预报 详细 代码下载:http://www.demodashi.com/demo/10634.html 一.准备工作 1.注册微信小程序 2.注册和风天气账号 3.注册百 ...

  5. TaskController

    package main.java.com.zte.controller.system; import java.io.PrintWriter; import java.util.ArrayList; ...

  6. HDUOJ----1301 Jungle Roads

    Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. 【LeetCode】115. Populating Next Right Pointers in Each Node (2 solutions)

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

  8. 手动删除Kafka Topic

    一.删除Kafka topic 运行./bin/kafka-topics  --delete --zookeeper [zookeeper server]  --topic [topic name]: ...

  9. 设置PdfPTable与标题间的距离

    使用itextsharp生成PDF时,需要改变标题与文档中添加的PdfPTable间距离,改变SpacingBefore值不起作用,查了下这方面的知识较少,自己跟踪代码,找到了设置位置是在使用iTex ...

  10. Linux内核同步 - spin_lock

    一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享数据被中断上下文和进程上下文访问,该如何保护呢?如果只有进程上下文的访问,那么可以考虑使用semaphore或者mutex的锁机 ...