C# 怎么在一个已经存在的EXCEL里写入数据?

u1 2007-04-18 10:42:47
C# 怎么在一个已经存在的EXCEL里写入数据?
...全文
1161 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
u1 2007-04-18
  • 打赏
  • 举报
回复
可不可以用using 的语句解决?
blackant2 2007-04-18
  • 打赏
  • 举报
回复
add reference==>com==>microsoft excel 11.0 object library
wzq6511 2007-04-18
  • 打赏
  • 举报
回复
添加引用,com组件microsoft excel
egyqy 2007-04-18
  • 打赏
  • 举报
回复
不懂,帮顶
u1 2007-04-18
  • 打赏
  • 举报
回复
to congrui() :
我按照你的代码写了,可提示:
找不到类型或命名空间名称“Excel”(是否缺少 using 指令或程序集引用?)

怎么解决?谢谢。
zhangliu_521 2007-04-18
  • 打赏
  • 举报
回复
http://developer.51cto.com/art/200612/36386.htm
blackant2 2007-04-18
  • 打赏
  • 举报
回复
然后是完全以xml方式操作它的示例
另存为一个xls就可以看到效果了
using System;
using System.Data;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Xml;

public class MyClass
{
public static void Main()
{
//这是excel中要用到的两个命名空间
string ssNameSpaceUri = "urn:schemas-microsoft-com:office:spreadsheet";
string EmptyNameSpaceUri = "urn:schemas-microsoft-com:office:spreadsheet";
//生成测试用数据集
DataSet ds = CreateDataSet();
//取出模板
XmlDocument xd = new XmlDocument();
xd.Load("..\\..\\test.xml");
XmlElement xe = xd.DocumentElement;
//此xml文档中只有一个table
//也可以引入namespace,然后用SelectSingleNode方法
XmlNode table = xe.ChildNodes[4].ChildNodes[0];

//修改表格属性,加入新加的行数
XmlAttribute xaExpandedRowCount = table.Attributes["ss:ExpandedRowCount"];
Int32 rowCount = Int32.Parse(xaExpandedRowCount.Value) + ds.Tables[0].Rows.Count;
xaExpandedRowCount.Value = rowCount.ToString();

foreach (DataRow dr in ds.Tables[0].Rows) {
//生成每一行
XmlNode xnRow = xd.CreateElement("Row", EmptyNameSpaceUri);

//加入ss:AutoFitHeight属性
XmlAttribute xaAutoFitHeight = xd.CreateAttribute("AutoFitHeight", ssNameSpaceUri);
xaAutoFitHeight.Value = "0";
xnRow.Attributes.Append(xaAutoFitHeight);
for (int index = 0; index < ds.Tables[0].Columns.Count; index++) {
//为每个数据列生成新的xmlNode
XmlNode xnCell = xd.CreateElement("Cell", EmptyNameSpaceUri);
//如果是第一列,加入ss:index属性
if (index == 0)
{
XmlAttribute xaIndex = xd.CreateAttribute("Index", ssNameSpaceUri);
xaIndex.Value = "3";
xnCell.Attributes.Append(xaIndex);
}
//为每一列生成数据
XmlNode xnData = xd.CreateElement("Data", EmptyNameSpaceUri);
//这儿都是指定string(文本)
XmlAttribute xaType = xd.CreateAttribute("Type", ssNameSpaceUri);
xaType.Value = "String";
xnData.Attributes.Append(xaType);
xnData.InnerText = dr[index].ToString();
xnCell.AppendChild(xnData);
//加入数据到列
xnRow.AppendChild(xnCell);
}

//新数据行加入完毕
table.AppendChild(xnRow);
}

//另存为xls
using (StreamWriter sw = new StreamWriter("..\\..\\test.xls", false, Encoding.Unicode))
{
sw.Write(xd.OuterXml);
sw.Flush();
sw.Close();
}

Console.Read();
}



static DataSet CreateDataSet()
{
DataTable master = new DataTable("product");
master.Columns.Add(new DataColumn("Index", typeof(int)));
master.Columns.Add(new DataColumn("Jan", typeof(int)));
master.Columns.Add(new DataColumn("Feb", typeof(int)));
master.Columns.Add(new DataColumn("Mar", typeof(int)));
master.Columns.Add(new DataColumn("Apr", typeof(int)));

for (int i = 0; i < 10; i++)
{
DataRow DRmaster = master.NewRow();
DRmaster[0] = i;
DRmaster[1] = i;
DRmaster[2] = i;
DRmaster[3] = i;
DRmaster[4] = i;
master.Rows.Add(DRmaster);
}
//返回数据集
DataSet ds = new DataSet();
ds.Tables.Add(master);

return ds;

}
}
blackant2 2007-04-18
  • 打赏
  • 举报
回复
下面是我以前写的一个测试,以xml方式扣作excel,很方便但缺点是只有0ffice 2003才能打开这样的xls文件.......

第一步先建一个excel模板文件(以xml格式另存为test.xml)
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
<Created>1996-12-17T01:32:42Z</Created>
<LastSaved>2007-04-11T01:31:33Z</LastSaved>
<Version>11.6568</Version>
</DocumentProperties>
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<RemovePersonalInformation/>
</OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>4530</WindowHeight>
<WindowWidth>8505</WindowWidth>
<WindowTopX>480</WindowTopX>
<WindowTopY>120</WindowTopY>
<AcceptLabelsInFormulas/>
<ProtectStructure>False</ProtectStructure>
<ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
<Style ss:ID="s22">
<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>
<Font ss:FontName="宋体" x:CharSet="134" ss:Size="16" ss:Color="#FF0000"/>
</Style>
<Style ss:ID="s24">
<Alignment ss:Vertical="Center"/>
</Style>
<Style ss:ID="s26">
<Alignment ss:Horizontal="Center" ss:Vertical="Center"/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="8" x:FullColumns="1"
x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
<Row ss:AutoFitHeight="0" ss:Span="3"/>
<Row ss:Index="5" ss:AutoFitHeight="0">
<Cell ss:Index="3" ss:MergeAcross="4" ss:MergeDown="1" ss:StyleID="s22"><Data
ss:Type="String">标头</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0"/>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="3" ss:MergeDown="1" ss:StyleID="s24"><Data ss:Type="String">序号</Data></Cell>
<Cell ss:MergeAcross="3" ss:StyleID="s26"><Data ss:Type="String">销售额</Data></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:Index="4"><Data ss:Type="String">1月</Data></Cell>
<Cell><Data ss:Type="String">2月</Data></Cell>
<Cell><Data ss:Type="String">3月</Data></Cell>
<Cell><Data ss:Type="String">4月</Data></Cell>
</Row>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<Unsynced/>
<Print>
<ValidPrinterInfo/>
<PaperSizeIndex>9</PaperSizeIndex>
<HorizontalResolution>300</HorizontalResolution>
<VerticalResolution>300</VerticalResolution>
</Print>
<Selected/>
<TopRowVisible>5</TopRowVisible>
<Panes>
<Pane>
<Number>3</Number>
<ActiveRow>8</ActiveRow>
<RangeSelection>R9:R11</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
u1 2007-04-18
  • 打赏
  • 举报
回复
楼上能给出相应代码吗?
谢谢。
blackant2 2007-04-18
  • 打赏
  • 举报
回复
建议使用ado.net而不是Excel.Application操作excel
又快又安全
congrui 2007-04-18
  • 打赏
  • 举报
回复
首先是如何创建、打开、读取、写入、保存的一般性代码:


using System;
using System.Reflection; // 引用这个才能使用Missing字段

namespace CExcel1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
//创建Application对象
Excel.Application xApp=new Excel.ApplicationClass();

xApp.Visible=true;
//得到WorkBook对象, 可以用两种方式之一: 下面的是打开已有的文件
Excel.Workbook xBook=xApp.Workbooks._Open(@"D:\Sample.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value
,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
//xBook=xApp.Workbooks.Add(Missing.Value);//新建文件的代码
//指定要操作的Sheet,两种方式:

Excel.Worksheet xSheet=(Excel.Worksheet)xBook.Sheets[1];
//Excel.Worksheet xSheet=(Excel.Worksheet)xApp.ActiveSheet;

//读取数据,通过Range对象
Excel.Range rng1=xSheet.get_Range("A1",Type.Missing);
Console.WriteLine(rng1.Value2);

//读取,通过Range对象,但使用不同的接口得到Range
Excel.Range rng2=(Excel.Range)xSheet.Cells[3,1];
Console.WriteLine(rng2.Value2);

//写入数据
Excel.Range rng3=xSheet.get_Range("C6",Missing.Value);
rng3.Value2="Hello";
rng3.Interior.ColorIndex=6; //设置Range的背景色

//保存方式一:保存WorkBook
xBook.SaveAs(@"D:\CData.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value);

//保存方式二:保存WorkSheet
xSheet.SaveAs(@"D:\CData2.xls",
Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);


//保存方式三
xBook.Save();

xSheet=null;
xBook=null;
xApp.Quit(); //这一句是非常重要的,否则Excel对象不能从内存中退出
xApp=null;
}
}
}

bitpolar 2007-04-18
  • 打赏
  • 举报
回复
别Create文件,Open就行了呗
Eleve 2007-04-18
  • 打赏
  • 举报
回复
mark没准以后能用到呢
honkerhero 2007-04-18
  • 打赏
  • 举报
回复
MARK,XML操作方式不错,以前没研究透
congrui 2007-04-18
  • 打赏
  • 举报
回复
add reference==>com==>microsoft excel 11.0 object library
然后添加
using Excel = Microsoft.Office.Interop.Excel;
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧