急!新手求助EXCEL操作和创建文件夹问题,详见内容。
新手刚学编程碰到个问题不知怎么解决,具体是这样的:
现在有一个EXCEL表1,A列是地州名称,B列是区县名称,C列是乡镇名称,D列是村名。
另外有一个EXCEL表2,是已经设计好的表格,其中的A列留空。
1.首先需要根据表1的内容建立多级文件夹,在根目录下,第一级是地州文件夹,然后地州里包含区县,最后区县里包含乡镇。
2.在每一个乡镇文件夹中放入一个表2,要求A列中填入该乡镇所属的村名称。
以上。
我只会简单的读取EXCEL或者建个文件夹,关键是怎么根据表1的内容去判断和指定创建多级文件夹,还要提出一个乡镇对应的所有村名称,写入到另一个EXCEL的指定列中,这个实在是不会写。
事情紧急,身边也没有编程厉害的人指导,求各位帮帮忙!
[解决办法]
你应该会啊。
你首先会把Excel读取成DataTable吗?
#region 导入Excel数据相关函数
/// <summary>
/// 根据文件名获得Excel的工作薄名称
/// </summary>
/// <param name="excelFileName"></param>
/// <returns></returns>
public static IList<string> GetExcelTablesName(string excelFileName)
{
using (OleDbConnection olbDbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + excelFileName + ";Extended Properties = \"Excel 8.0;HDR=YES;IMEX=1;\""))
{
try
{
olbDbConn.Open();
DataTable ExcelTableNames = olbDbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
IList<string> tableList = new List<string>();
foreach (DataRow dr in ExcelTableNames.Rows)
{
tableList.Add((string)dr["TABLE_NAME"]);
}
return tableList;
}
catch (Exception ex)
{
return null;
}
finally
{
olbDbConn.Close();
olbDbConn.Dispose();
}
}
}
/// <summary>
/// 根据文件名、工作薄名称获得数据表
/// </summary>
/// <param name="excelFileName"></param>
/// <param name="tablesName"></param>
/// <returns></returns>
public static DataTable GetExcelDataTable(string excelFileName, string tablesName)
{
using (OleDbConnection olbDbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + excelFileName + ";Extended Properties = \"Excel 8.0;HDR=YES;IMEX=1;\""))
{
try
{
string sql = "SELECT * FROM [{0}]";
olbDbConn.Open();
OleDbDataAdapter da = new OleDbDataAdapter();
System.Data.DataSet ds = new System.Data.DataSet();
DataTable dtExcelData = null;
da.SelectCommand = new OleDbCommand(string.Format(sql, tablesName), olbDbConn);
da.Fill(ds, tablesName);
return ds.Tables[tablesName];
}
catch (Exception ex)
{
return null;
}
finally
{
olbDbConn.Close();
olbDbConn.Dispose();
}
}
}
public static void ResetColumnTypeByString(DataTable dt, string columnName)
{
string TempColumnName = "temp";
if (dt.Columns.Contains(columnName) && dt.Columns[columnName].DataType != Type.GetType("System.String"))
{
dt.Columns.Add(TempColumnName, Type.GetType("System.String"));
try
{
foreach (DataRow dr in dt.Rows)
{
dr[TempColumnName] = dr[columnName].ToString();
}
dt.Columns.Remove(columnName);
dt.Columns[TempColumnName].ColumnName = columnName;
}
catch (Exception ex)
{
dt.Columns.Remove(TempColumnName);
throw ex;
}
}
}
#endregion
上面是导入,然后对DataTable循环遍历
foreach(DataRow in dt.rows)
{
string str = string.empty;//临时存放文件夹路径
for(int i=0;i<dt.columns;i++)
{
str = str + dr[i].tostring();
按顺序取第i列,然后看有没有存在该文件夹
如果没有则新建
如果有则跳过
}
}
判断文件夹存在与否你应该会吧,建议文件夹呢?
[解决办法]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Excel = Microsoft.Office.Interop.Excel;
using System.Globalization;
using System.Windows.Forms;
namespace Print
{
public class ExcelExport
{
public static void saveOnExcel(String strPath, int StartFrequency, int EndFrequency, float FreqStep, double QualityFactor,
double Bandwidth, double ResonantFreq, double ResonantImped, double ResonantPhase,
double AntiFreq, double AntiImped, double AntiPhase)
{
System.Globalization.CultureInfo ciBack = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
xlWorkSheet.Cells[1, 1] = "开始";
xlWorkSheet.Cells[2, 1] = "停止";
xlWorkSheet.Cells[3, 1] = "间隔";
xlWorkSheet.Cells[5, 1] = "品质因素";
xlWorkSheet.Cells[6, 1] = "频带宽度";
xlWorkSheet.Cells[7, 1] = "谐振频率";
xlWorkSheet.Cells[8, 1] = "谐振阻抗";
xlWorkSheet.Cells[9, 1] = "谐振相位";
xlWorkSheet.Cells[10, 1] = "抗谐振频率";
xlWorkSheet.Cells[11, 1] = "抗谐振阻抗";
xlWorkSheet.Cells[12, 1] = "抗谐振相位";
xlWorkSheet.Cells[1, 3] = "" + StartFrequency;
xlWorkSheet.Cells[2, 3] = "" + EndFrequency;
xlWorkSheet.Cells[3, 3] = "" + FreqStep.ToString("#0.0");
xlWorkSheet.Cells[5, 3] = "" + QualityFactor.ToString("#0.0");
xlWorkSheet.Cells[6, 3] = "" + Bandwidth.ToString("#0.0");
xlWorkSheet.Cells[7, 3] = "" + ResonantFreq;
xlWorkSheet.Cells[8, 3] = "" + ResonantImped;
xlWorkSheet.Cells[9, 3] = "" + ResonantPhase.ToString("#0.0");
xlWorkSheet.Cells[10,3] = "" + AntiFreq;
xlWorkSheet.Cells[11,3] = "" + AntiImped;
xlWorkSheet.Cells[12,3] = "" + AntiPhase.ToString("#0.0");
xlWorkSheet.Cells[1, 5] = "kHz";
xlWorkSheet.Cells[2, 5] = "kHz";
xlWorkSheet.Cells[3, 5] = "kHz";
xlWorkSheet.Cells[5, 5] = "Q";
xlWorkSheet.Cells[6, 5] = "%";
xlWorkSheet.Cells[7, 5] = "kHz";
xlWorkSheet.Cells[8, 5] = "Ohm";
xlWorkSheet.Cells[9, 5] = "Deg";
xlWorkSheet.Cells[10, 5] = "kHz";
xlWorkSheet.Cells[11, 5] = "Ohm";
xlWorkSheet.Cells[12, 5] = "Deg";
xlWorkBook.SaveAs(strPath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();
releaseObject(xlWorkSheet);
releaseObject(xlWorkBook);
releaseObject(xlApp);
System.Threading.Thread.CurrentThread.CurrentCulture = ciBack;
}
private static void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
obj = null;
MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
}
finally
{
GC.Collect();
}
}
}
}
实话是本来不想给你代码的,不过算了,这个是完全码,自己去修改吧,如果不会我就不想说什么了。