首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于用c#读取、另存excel的有关问题

2011-12-21 
关于用c#读取、另存excel的问题。现在有这样一个需求,有个客户要求我们公司的信息编辑人员根据他提供的模板e

关于用c#读取、另存excel的问题。
现在有这样一个需求,有个客户要求我们公司的信息编辑人员根据他提供的模板excel文件建立一份价格数据表,格式是固定的,这个excel有2个sheet,这2个sheet比较复杂的。

每个sheet有部分数据可以从我司的价格数据库中读取,有部分数据则要进行人工计算的,所以我的打算是把需要人工计算的部分做成网页,让信息编辑手工录入,可以从数据库里面获取的价格信息我帮他从数据库里面提取出来,这样数据要求就ok了。

但是怎么把这些数据弄进这2个极其复杂的sheet中,比较麻烦,如果靠手工的录入,非烦死人不可,所以我想了个偷懒的办法,也就是群发email的办法。

首先读取这个xls文件,然后将里面需要数据填充的单元格以变量名代替,接下来根据要求分门别类的把数据替换进去,最后再另存为一个新的xls文件,通过程序作为email的附件发送给客户。

现求c#打开excel的方法,包括读取,以及查找、替换单元格,还有就是另存的算法。谢谢。

[解决办法]
建议不要操作EXCEL,从OFF2007开始,所有文件好像都成为XML格式了,你把数据存为XML得了,用EXCEL也能打开,把扩展名存为XLS就行了
[解决办法]
Excel.Application xApp = new Excel.ApplicationClass();

Excel.Workbook xBook = xApp.Workbooks.Open(Server.MapPath( "aaa.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, Missing.Value, Missing.Value);//打开EXCEL

Excel.Worksheet xSheet = (Excel.Worksheet)xBook.Sheets[ "Input "];//得到Sheet

xSheet.get_Range( "M1 ", Missing.Value).Value2 = Value;//单个单元格替换
object [,] M9_M37 = new object[29,1];
xSheet.get_Range( "M9:M37 ", Missing.Value).Value2 = M9_M37;//数组方式替换

xBook.SaveCopyAs(Server.MapPath(filePath + "/bb.xls "));//另存

xBook.Close(false, Missing.Value, Missing.Value);//关闭
xSheet = null;
xBook = null;
xApp.Quit();
xApp = null;

需要引用Excel组件
[解决办法]
给您一个“读写Excel文件”的例子:
1、在 Microsoft Visual Studio .NET 的“文件”菜单上,单击“新建”,然后单击“项目”。
2、在“新建项目”对话框中,选择“Visual C#项目”,再选择“Windows 应用程序”模板。
3、键入 ExcelApp 作为该程序的名称,然后单击确定。
4、在“解决方案资源管理器”的ExcelApp项目,鼠标右击“引用”,点击“添加引用”,在COM中选择“Microsoft Excel 10.0 Object Library”。
5、在Form1.cs的视图设计器中,添加如下控件:
控件类型 控件名称  控件属性 属性值
Button button1 Text 生成一个Excel文件
Button button2 Text 给Excel添加工作表
Button button3 Text 给Excel删除工作表
Button button4 Text 改变工作表行和列大小
6、在Form1.cs的代码设计器中,引用添加如下代码
using System.Reflection;
7、在Form1.cs的视图设计器中,选中button1,在属性框中选中事件,双击Click,在Form1.cs的代码设计器中,添加修改如下代码
private void button1_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog SaveFileDialog1 = new SaveFileDialog();
SaveFileDialog1.Filter = "Excel文件(*.xls)|*.xls ";
if (SaveFileDialog1.ShowDialog() == DialogResult.OK)
{
string[,] myData = {
{ "车牌号 ", "类 型 ", "品 牌 ", "型 号 ", "颜 色 ", "附加费证号 ", "车架号 "},
{ "浙KA3676 ", "危险品 ", "货车 ", "铁风SZG9220YY ", "白 ", "1110708900 ", "022836 "},
{ "浙KA4109 ", "危险品 ", "货车 ", "解放CA4110P1K2 ", "白 ", "223132 ", "010898 "},
{ "浙KA0001A ", "危险品 ", "货车 ", "南明LSY9190WS ", "白 ", "1110205458 ", "0474636 "},
{ "浙KA0493 ", "上普货 ", "货车 ", "解放LSY9190WS ", "白 ", "1110255971 ", "0094327 "},
{ "浙KA1045 ", "普货 ", "货车 ", "解放LSY9171WCD ", "蓝 ", "1110391226 ", "0516003 "},
{ "浙KA1313 ", "普货 ", "货车 ", "解放9190WCD ", "蓝 ", "1110315027 ", "0538701 "},


{ "浙KA1322 ", "普货 ", "货车 ", "解放LSY9190WS ", "蓝 ", "24323332 ", "0538716 "},
{ "浙KA1575 ", "普货 ", "货车 ", "解放LSY9181WCD ", "蓝 ", "1110314149 ", "0113018 "},
{ "浙KA1925 ", "普货 ", "货车 ", "解放LSY9220WCD ", "蓝 ", "1110390626 ", "00268729 "},
{ "浙KA2258 ", "普货 ", "货车 ", "解放LSY9220WSP ", "蓝 ", "111048152 ", "00320 "}};

Excel.Application m_Excel = new Excel.Application();//创建一个Excel对象(同时启动EXCEL.EXE进程)
m_Excel.SheetsInNewWorkbook = 2;//工作表为两个
Excel._Workbook m_Book = (Excel._Workbook)(m_Excel.Workbooks.Add(Missing.Value));//添加新工作簿
Excel._Worksheet m_Sheet = (Excel._Worksheet)(m_Book.Worksheets.get_Item(1));//读取工作表1
m_Sheet.Name = "车牌表 ";//给工作表1命名
m_Sheet.Cells[1, 4] = "普通报表 ";//第一行为报表名称
for (int i = 0; i < 11; i++)//逐行写入数据
{
for (int j = 0; j < 7; j++)
{
m_Sheet.Cells[2 + i, 1 + j] = " ' " + myData[i, j];//以单引号开头,表示该单元格为纯文本
}
}
m_Book.SaveAs(SaveFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
m_Book.Close(false, Missing.Value, Missing.Value);
m_Excel.Quit();
m_Book = null;
m_Sheet = null;
m_Excel = null;
MessageBox.Show(this, "Excel文件已经生成。 ", "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception Mye)
{
MessageBox.Show(this, Mye.Message, "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
GC.Collect();//强制垃圾回收,否则EXCEL.EXE进程不能及时退出
}
8、在Form1.cs的视图设计器中,选中button2,在属性框中选中事件,双击Click,在Form1.cs的代码设计器中,添加修改如下代码
private void button2_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.Filter = "Excel文件(*.xls)|*.xls ";
if (OpenFileDialog1.ShowDialog() == DialogResult.OK)
{
Excel.Application m_Excel = new Excel.Application();//创建一个Excel对象(同时启动EXCEL.EXE进程)
Excel._Workbook m_Book = (Excel._Workbook)(m_Excel.Workbooks.Open(OpenFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value));//打开工作簿
m_Book.Sheets.Add(Missing.Value, m_Excel.Sheets[m_Excel.Sheets.Count], Missing.Value, Missing.Value);//工作薄最后增加一个工作表
m_Book.Save();//保存
m_Book.Close(false, Missing.Value, Missing.Value);
m_Excel.Quit();
m_Book = null;
m_Excel = null;
MessageBox.Show(this, "已经给Excel文件添加了一个工作表。 ", "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception Mye)
{
MessageBox.Show(this, Mye.Message, "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
GC.Collect();//强制垃圾回收,否则EXCEL.EXE进程不能及时退出
}

[解决办法]
9、在Form1.cs的视图设计器中,选中button3,在属性框中选中事件,双击Click,在Form1.cs的代码设计器中,添加修改如下代码


private void button3_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.Filter = "Excel文件(*.xls)|*.xls ";
if (OpenFileDialog1.ShowDialog() == DialogResult.OK)
{
Excel.Application m_Excel = new Excel.Application();//创建一个Excel对象(同时启动EXCEL.EXE进程)
Excel._Workbook m_Book = (Excel._Workbook)(m_Excel.Workbooks.Open(OpenFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value));//打开工作簿
Excel._Worksheet m_Sheet = (Excel._Worksheet)(m_Book.Worksheets.get_Item(m_Book.Sheets.Count));//读取最后一个工作表
m_Sheet.Delete();//删除工作表
m_Book.Save();//保存
m_Book.Close(false, Missing.Value, Missing.Value);
m_Excel.Quit();
m_Book = null;
m_Sheet = null;
m_Excel = null;
MessageBox.Show(this, "已经给Excel文件删除了一个工作表。 ", "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception Mye)
{
MessageBox.Show(this, Mye.Message, "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
GC.Collect();//强制垃圾回收,否则EXCEL.EXE进程不能及时退出
}
10、在Form1.cs的视图设计器中,选中button4,在属性框中选中事件,双击Click,在Form1.cs的代码设计器中,添加修改如下代码
private void button4_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog OpenFileDialog1 = new OpenFileDialog();
OpenFileDialog1.Filter = "Excel文件(*.xls)|*.xls ";
if (OpenFileDialog1.ShowDialog() == DialogResult.OK)
{
Excel.Application m_Excel = new Excel.Application();//创建一个Excel对象(同时启动EXCEL.EXE进程)
Excel._Workbook m_Book = (Excel._Workbook)(m_Excel.Workbooks.Open(OpenFileDialog1.FileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value));//打开工作簿
Excel._Worksheet m_Sheet = (Excel._Worksheet)(m_Book.Worksheets.get_Item(m_Book.Sheets.Count));//读取最后一个工作表
m_Sheet.Rows.RowHeight = 2 / 0.035; //行高为1厘米
m_Sheet.Columns.ColumnWidth = 10;//10个字符宽
m_Book.Save();//保存
m_Book.Close(false, Missing.Value, Missing.Value);
m_Excel.Quit();
m_Book = null;
m_Sheet = null;
m_Excel = null;
MessageBox.Show(this, "Excel的一个工作表的行和列大小已经改变。 ", "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception Mye)
{
MessageBox.Show(this, Mye.Message, "信息提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
GC.Collect();//强制垃圾回收,否则EXCEL.EXE进程不能及时退出
}
11、编译


要想轻松开发软件,详见http://www.psec.net.cn

[解决办法]
学习+ mark

热点排行