C#操作文件夹和EXCEl表要点.docx
《C#操作文件夹和EXCEl表要点.docx》由会员分享,可在线阅读,更多相关《C#操作文件夹和EXCEl表要点.docx(24页珍藏版)》请在冰豆网上搜索。
C#操作文件夹和EXCEl表要点
C#操作Excel总结
0. 导入命名空间:
1
2
3
4
using Microsoft.Office.Core;
using Microsoft.Office.Interop.Excel;
using System.IO;
using System.Reflection;
1. 如何打开已有excel文档,或者创建一个新的excel文档
1
2
3
Applicationapp=new Application();
Workbookswbks=app.Workbooks;
_Workbook_wbk=wbks.Add(xxx);
若打开已有excel,把“xxx”替换成该excel的文件路径;
注:
若新建一个excel文档,“xxx”替换成true即可;不过这里新建的excel文档默认只有一个sheet。
2. 取得、删除和添加sheet
1
Sheetsshs=_wbk.Sheets;
2.1取得:
1
2
//i是要取得的sheet的index
_Worksheet_wsh=(_Worksheet)shs.get_Item(i)
2.2删除:
1
2
3
//删除sheet必须的设置
app.DisplayAlerts=false;
_wsh.Delete();
2.3添加:
1
2
//a(before),b(after):
确定添加位置;c:
数目;d:
类型
app.Worksheets.Add(a,b,c,d);
2.4sheet的重命名
1
_wsh.Name="xxx";
3. 删除行和列
3.1删除行:
1
((Range)_wsh.Rows[3,Missing.Value]).Delete(XlDeleteShiftDirection.xlShiftUp);
3.2删除列:
1
2
3
4
_wsh.get_Range(
_wsh.Cells[1,2],
_wsh.Cells[_wsh.Rows.Count,2]).Delete(XlDeleteShiftDirection.xlShiftToLeft
);
4. 添加行和列
4.1添加行:
1
2
((Range)_wsh.Rows[11,Missing.Value])
.Insert(Missing.Value,XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
4.2添加列:
1
2
3
_wsh.get_Range(
_wsh.Cells[1,1],_wsh.Cells[_wsh.Rows.Count,1])
.Insert(Missing.Value,XlInsertShiftDirection.xlShiftToRight);
5. 单元格操作
5.1单元格的取得
1
2
//获得单元格对象
_wsh.Cells[row,cell]
5.2设置公式
1
2
//在对应的单元格输入公式即可
_wsh.Cells[row,cell]="=Sum(A1/B1)";
5.3合并单元格
1
((Range)_wsh.Rows[1,Missing.Value]).Merge(Missing.Value);
5.4设置行高和列宽
1
2
((Range)_wsh.Rows[3,Missing.Value]).RowHeight=5;
((Range)_wsh.Rows[3,Missing.Value]).ColumnWidth=5;
5.5设置单元格颜色颜色共有56中,详情请参照附录的[颜色对照表]
1
((Range)_wsh.Rows[1,Missing.Value]).Interior.ColorIndex=3;
5.6设置字号
1
((Range)_wsh.Cells[1,"B"]).Font.Size=8;
5.7是否设置粗体
1
((Range)_wsh.Rows[1,Missing.Value]).Font.Bold=false;
5.8单元格/区域、水平垂直居中
1
((Range)_wsh.Cells[2,1]).HorizontalAlignment=XlVAlign.xlVAlignCenter;
5.9设置区域边框
1
((Range)_wsh.Cells[3,3]).Borders.LineStyle=3;
5.10设置边框的上、下、左、右线条
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//左
_wsh.get_Range(
_wsh.Cells[2,1],_wsh.Cells[2,2])
.Borders[XlBordersIndex.xlEdgeLeft].Weight=XlBorderWeight.xlThick;//
//右
_wsh.get_Range(
_wsh.Cells[2,1],_wsh.Cells[2,2])
.Borders[XlBordersIndex.xlEdgeRight].Weight=XlBorderWeight.xlThick;//
//上
_wsh.get_Range(
_wsh.Cells[2,1],_wsh.Cells[2,2])
.Borders[XlBordersIndex.xlEdgeTop].Weight=XlBorderWeight.xlThick;//下
//下
_wsh.get_Range(
_wsh.Cells[2,1],_wsh.Cells[2,2])
.Borders[XlBordersIndex.xlEdgeBottom].Weight=XlBorderWeight.xlThick;
6. 指定区域的复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
_Worksheet_wsh=(_Worksheet)shs.get_Item
(1);//复制选中区域的内容
Rangerange=_wsh.get_Range(_wsh.Cells[7,1],_wsh.Cells[10,_wsh.Columns.Count]);
range.Select();
range.Copy(Type.Missing);
//选中粘贴的起始位置
Rangetest=((Range)_wsh.Cells[11,1]);
test.Select();
//屏蔽掉Alert,默认确定粘贴
app.DisplayAlerts=false;
test.Parse(Missing.Value,Missing.Value);
注:
Type.Missing和Missing.Value,在excel的操作中被视为某些参数的默认值,他们起到的作用很多时候是形式补足参数
7. excel文件的保存,及后续处理
7.1文件保存
1
2
3
4
5
//屏蔽掉系统跳出的Alert
app.AlertBeforeOverwriting=false;
//保存到指定目录
SaveAs(filePath,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
注:
这个地方只能采用该方法保存,不然在指定路径下保存文件外,在我的文档中也会生成一个对应的副本
7.2后续处理:
退出和释放
1
2
3
4
5
6
7
//_wbk.Close(null,null,null);
//wbks.Close();
app.Quit();
//释放掉多余的excel进程
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app=null;
说明:
在application关闭的过程中,通常我们有两种方案:
#直接退出app
#先关闭workbook,然后关闭workbooks,最后在退出app
鉴于这两种方式,或许本质上是一样的(这点需要证明),但是依据我们软件开发的原则:
哪里需要哪里声明,哪里结束哪里释放回收。
既然在直接退出app的时候,我们不清楚workbook和workbooks具体在什么时间关闭,不如在结束的时候直接手动关闭,这样做可以做到资源的快速直接回收;
所以,建议采用先关闭workbook,然后关闭workbooks,最后在退出app。
8. 关于单元格设置域和取得域里需要的数据
8.1若单元格已经设置为下拉框
1
2
3
//这里的“1,2,3”设置的就是下拉框的值
((Range)_wsh.Cells[2,1])
.Validation.Modify(XlDVType.xlValidateList,XlDVAlertStyle.xlValidAlertStop,Type.Missing,"1,2,3",Type.Missing);
8.2若单元格还没有设置为下拉框的形式
1
2
((Range)_wsh.Cells[2,1])
.Validation.Add(XlDVType.xlValidateList,XlDVAlertStyle.xlValidAlertStop,Type.Missing,"1,2,3",Type.Missing);
8.3取得下拉框域的值
1
string strValue=((Range)_wsh.Cells[2,1]).Validation.Formula1;
注:
若在excel模板中通过有效性设定了下拉框的值,strValue得到的将会是excel里的公式,需将其转换,取得strValue后,可以根据其索引得到你需要的数值;
9. 隐藏行和隐藏列
9.1隐藏行
1
_wsh.get_Range(_wsh.Cells[19,1],_wsh.Cells[22,1]).EntireRow.Hidden=true;
9.2隐藏列
1
2
_wsh.get_Range(_wsh.Cells[1,1],_wsh.Cells[_wsh.Rows.Count,1])
.EntireColumn.Hidden=true;
c#中与文件文件夹相关操作
2009-05-1510:
03
privateconststringFILE_NAME="ErroLog.txt";
publicstaticvoidWriteFile(stringstr)
...{
StreamWritersr;
if(File.Exists(FILE_NAME))//如果文件存在,则创建File.AppendText对象
...{
sr=File.AppendText(FILE_NAME);
}
else//如果文件不存在,则创建File.CreateText对象...{
sr=File.CreateText(FILE_NAME);
}
sr.WriteLine(str);
sr.Close();
}
追加文件
StreamWritersw=File.AppendText(Server.MapPath(".")+"\\myText.txt");sw.WriteLine("追逐理想");
sw.WriteLine("kzlll");
sw.WriteLine(".NET笔记");
sw.Flush();
sw.Close();
拷贝文件
stringOrignFile,NewFile;
OrignFile=Server.MapPath(".")+"\\myText.txt";
NewFile=Server.MapPath(".")+"\\myTextCopy.txt";
File.Copy(OrignFile,NewFile,true);
删除文件
stringdelFile=Server.MapPath(".")+"\\myTextCopy.txt";
File.Delete(delFile);
移动文件
stringOrignFile,NewFile;
OrignFile=Server.MapPath(".")+"\\myText.txt";
NewFile=Server.MapPath(".")+"\\myTextCopy.txt";
File.Move(OrignFile,NewFile);
创建目录
//创建目录c:
\sixAge
DirectoryInfod=Directory.CreateDirectory("c:
\\sixAge");
//d1指向c:
\sixAge\sixAge1
DirectoryInfod1=d.CreateSubdirectory("sixAge1");
//d2指向c:
\sixAge\sixAge1\sixAge1_1
DirectoryInfod2=d1.CreateSubdirectory("sixAge1_1");
//将当前目录设为c:
\sixAge
Directory.SetCurrentDirectory("c:
\\sixAge");
//创建目录c:
\sixAge\sixAge2
Directory.CreateDirectory("sixAge2");
//创建目录c:
\sixAge\sixAge2\sixAge2_1
Directory.CreateDirectory("sixAge2\\sixAge2_1");
递归删除文件夹及文件
<%@PageLanguage=%>
<%@Importnamespace="System.IO"%>
publicvoidDeleteFolder(stringdir)
{
if(Directory.Exists(dir))//如果存在这个文件夹删除之
{
foreach(stringdinDirectory.GetFileSystemEntries(dir)){
if(File.Exists(d))
File.Delete(d);//直接删除其中的文件
else
DeleteFolder(d);//递归删除子文件夹
}
Directory.Delete(dir);//删除已空文件夹
Response.Write(dir+"文件夹删除成功");
}
else
Response.Write(dir+"该文件夹不存在");//如果文件夹不存在则提示
}
protectedvoidPage_Load(Objectsender,EventArgse)
{
stringDir="D:
\\gbook\\11";
DeleteFolder(Dir);//调用函数删除文件夹
}
//======================================================
//实现一个静态方法将指定文件夹下面的所有内容copy到目标文件夹下面//如果目标文件夹为只读属性就会报错。
//April18April2005InSTU
//======================================================
publicstaticvoidCopyDir(stringsrcPath,stringaimPath)
{
try
{
//检查目标目录是否以目录分割字符结束如果不是则添加之
if(aimPath[aimPath.Length-1]!
=Path.DirectorySeparatorChar)aimPath+=Path.DirectorySeparatorChar;
//判断目标目录是否存在如果不存在则新建之
if(!
Directory.Exists(aimPath))
Directory.CreateDirectory(aimPath);
//得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组//如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法//string[]fileList=Directory.GetFiles(srcPath);
string[]fileList=Directory.GetFileSystemEntries(srcPath);//遍历所有的文件和目录
foreach(stringfileinfileList)
{
//先当作目录处理如果存在这个目录就递归Copy该目录下面的文件if(Directory.Exists(file))
CopyDir(file,aimPath+Path.GetFileName(file));
//否则直接Copy文件
else
File.Copy(file,aimPath+Path.GetFileName(file),true);
}
}
catch(Exceptione)
{
MessageBox.Show(e.ToString());
}
}
//======================================================
//实现一个静态方法将指定文件夹下面的所有内容Detele
//测试的时候要小心操作,删除之后无法恢复。
//April18April2005InSTU
//======================================================
publicstaticvoidDeleteDir(stringaimPath)
{
try
{
//检查目标目录是否以目录分割字符结束如果不是则添加之
if(aimPath[aimPath.Length-1]!
=Path.DirectorySeparatorChar)aimPath+=Path.DirectorySeparatorChar;
//得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组//如果你指向Delete目标文件下面的文件而不包含目录请使用下面的方法
//string[]fileList=Directory.GetFiles(aimPath);
string[]fileList=Directory.GetFileSystemEntries(aimPath);//遍历所有的文件和目录
foreach(stringfileinfileList)
{
//先当作目录处理如果存在这个目录就递归Delete该目录下面的文件if(Directory.Exists(file))
{
DeleteDir(aimPath+Path.GetFileName(file));
}
//否则直接Delete文件
else
{
File.Delete(aimPath+Path.GetFileName(file));
}
}
//删除文件夹
System.IO.Directory.Delete(aimPath,true);
}
catch(Exceptione)
{
MessageBox.Show(e.ToString());
}
}
需要引用命名空间:
usingSystem.IO;
/**////
///拷贝文件夹(包括子文件夹)到指定文件夹下,源文件夹和目标文件夹均需绝对路径.格式:
CopyFolder(源文件夹,目标文件夹);
///
///
///
//--------------------------------------------------
//作者:
明天去要饭QQ:
305725744
//---------------------------------------------------
publicstaticvoidCopyFolder(stringstrFromPath,stringstrToPath){
//如果源文件夹不存在,则创建
if(!
Directory.Exists(strFromPath))
{
Directory.CreateDirectory(strFromPath);
}
//取得要拷贝的文件夹名
stringstrFolderName=
strFromPath.Substring(strFromPath.LastIndexOf("\\")+
1,strFromPath.Length-strFromPath.LastIndexOf("\\")-1);
//如果目标文件夹中没有源文件夹则在目标文件夹中创建源文件夹if(!
Directory.Exists(strToPath+"\\"+strFolderName)){
Directory.CreateDirectory(strToPath+"\\"+strFolderName);}
//创建数组保存源文件夹下的文件名
string[]strFiles=Directory.GetFiles(strFromPath);
//循环拷贝文件
for(inti=0;i{
//取得拷贝的文件名,只取文件名,地址截掉。
stringstrFileName=
strFiles[i].Substring(strFiles[i].LastIndexOf("\\")+
1,strFiles[i].Length-strFiles[i].LastIndexOf("\\")-1);//开始拷贝文件,true表示覆盖同名文件
File.Copy(