外行人高分求助:c# excel读取数据并写入txt问题

原EXCEL表格里共4列标题,如下
工号,日期,上班,下班
举例:分别对应
377,2009-10-10,08:52:50 ----,19:13:00 ---- (这里不能用表格逗号表示单元格)
注:工号是1-9999的数字,上班下班的时间后面的“ ----”可能是其他字符或者直接是“休息”“旷工”“未刷卡”

要求导出的txt文件格式如下
0377,1,2009/10/10,08:52:50
0377,0,2009/10/10,19:13:00

也就是说EXCEL表中一行数据要被连续导出2次,第三和第四列的数据分别拿出来做成2行
其中第一列“工号”的数字不足4位前面补0补满4位,比如EXCEL里是58那TXT里就要导出为0058,
EXCEL表第二列“日期”里的“-”在TXT里要换成“/”,
EXCEL表上班和下班时间后面的“ ----”不需要( “ ----”这段字符可能会是其他文字),在TXT里只要导入前面的时间,
TXT第一个逗号后面“1”表示上班,“0”表示下班,“1”和“0”分别对应EXCEL表中的第三和第四列
这也就是为什么“上班”和“下班”这两列数据分别要拆开导入成TXT对应的两行的原因。
在第三和第四列中EXCEL表中如果出现“休息”“旷工”“未刷卡”,那么这段数据不导入TXT
比如“上班”中有时间,“下班”中出现非时间字符
那么,TXT中如上第一个逗号后面“0”这行没有
反之,TXT中如上第一个逗号后面“1”这行没有

本人外行,懂些皮毛,如下是网上搜集修改过的代码,
private DataSet myDataSet;
public static void filecreate(DataSet myDataSet)
{
FileStream fs = new FileStream("C:\\abc.txt ", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
foreach (DataRow dr in myDataSet.Tables[0].Rows)
{

}
sw.Flush();
sw.Close();
fs.Close();
}
这个是C#代码写的,请把foreach里面的实现方法补完,有更好的写法,或者VB代码也行,我这里用的是VS2005和VS2008
能够完成的可以加分。
请看清问题
上面列出是程序部分代码,其实就缺少foreach里面合适的实现方法
或者不用foreach,给个其他合适的方法也行。
这是我的连接代码
private void GetConnect()
{
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = c:\\kq.xls;Extended Properties=Excel 8.0";
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = " SELECT * FROM [Sheet1$] ";
myConn.Open();
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
myDataSet = new DataSet();
myCommand.Fill(myDataSet, "[Sheet1$]");
myConn.Close();
}
这是导入TXT代码
private void bt_strat_Click(object sender, EventArgs e)
{
filecreate(myDataSet);
MessageBox.Show("导出成功,文本存放在C:\\abc.txt ");
}

foreach中通过其他写法,经测可导出TXT,提问中的foreach我是故意留空白的。

不知道上面的老大回答行不行!如果不行你再看我这个吧!

看的好晕呀!我这样描述一下你看对不!
就是你有一个excel文件 里面有四列!想把这四列导入到txt里!

我之前做过一个 读取excel的东西 把excel读取到dataset里 然后再进行操作!你要是觉得我说的差不多!就百度Hi我!

已经做好了 ,百度Hi给你发消息没反应

代码贴在这了 看到了Hi我 我把源程序给你

DataSet ds = new DataSet();
private void btnSPath_Click(object sender, EventArgs e)
{
OleDbConnection conn = null;
try
{
OpenFileDialog openFile = new OpenFileDialog();
openFile.Filter = ("Excel 文件(*.xls)|*.xls");
if (openFile.ShowDialog() == DialogResult.OK)
{

string filename = openFile.FileName;

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
conn = new OleDbConnection(strConn);
string strExcel = "";
OleDbDataAdapter myCommand = null;

strExcel = "select * from [sheet1$]";
conn.Open();
myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds, "dtSource");
mySource.DataSource = ds;
mySource.DataMember = "dtSource";
dgvExcelInfo.DataSource = mySource;
}
}
catch (Exception ex) { ds = null; MessageBox.Show("查看出错:" + ex.ToString(), "错误信息"); }
finally
{
if (conn != null)
{
conn.Close();
}
}
}

private string ReplaceNum(string sNum)
{
string sReNum = string.Empty;
int iNumLength = 4 - sNum.Length;
for (int i = 0; i < iNumLength; i++)
{
sReNum += "0";
}

return sReNum += sNum;

}

private void btnConvert_Click(object sender, EventArgs e)
{
if (ds != null)
{

FileStream fs = new FileStream("E:\\NewsTxt.txt", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
string sNum = string.Empty;
string sDateYMD = string.Empty;
string sMDateHMS = string.Empty;
string sNDateHMS = string.Empty;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
for (int j = 0; j < 2; j++)
{
if (ds.Tables[0].Rows[i][0].ToString().Trim().Length != 4)
{
sNum = ReplaceNum(ds.Tables[0].Rows[i][0].ToString());
}
else
{
sNum = ds.Tables[0].Rows[i][0].ToString();
}
sMDateHMS = ds.Tables[0].Rows[i][2].ToString().Length >= 8 ? ds.Tables[0].Rows[i][2].ToString().Substring(0, 8) : ds.Tables[0].Rows[i][2].ToString();
sNDateHMS = ds.Tables[0].Rows[i][3].ToString().Length >= 8 ? ds.Tables[0].Rows[i][3].ToString().Substring(0, 8) : ds.Tables[0].Rows[i][3].ToString();
if (sMDateHMS.Length >= 8 && sNDateHMS.Length >= 8)
{

if (j == 0)
{
sw.WriteLine(sNum + ",1," + Convert.ToDateTime(ds.Tables[0].Rows[i][1]).ToString(@"yyyy-MM-dd").Replace('-', '/') + "," + sMDateHMS + "\r");
}
if (j == 1)
{
sw.WriteLine(sNum + ",0," + Convert.ToDateTime(ds.Tables[0].Rows[i][1]).ToString(@"yyyy-MM-dd").Replace('-', '/') + "," + sNDateHMS + "\r");
}
}
else
{
if (sMDateHMS.Length >= 8)
{
if (j == 0)
{
sw.WriteLine(sNum + ",1," + Convert.ToDateTime(ds.Tables[0].Rows[i][1]).ToString(@"yyyy-MM-dd").Replace('-', '/') + "," + sMDateHMS + "\r");
}
}
if (sNDateHMS.Length >= 8)
{
if (j == 1)
{
sw.WriteLine(sNum + ",0," + Convert.ToDateTime(ds.Tables[0].Rows[i][1]).ToString(@"yyyy-MM-dd").Replace('-', '/') + "," + sNDateHMS + "\r");
}
}
}

}
}
sw.Flush();
sw.Close();
MessageBox.Show(@"E:\ConvertTxtByExcel\NewsTxt.txt");
}
else
{
MessageBox.Show("请先选择Excel后再进行转换!");
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-13
本人不才,不会用ODBC4EXCEL这种高级技术,以下纯粹手工代码,写的比较乱,好在有些注释,将就看吧。

建立一个VB.NET控制台应用程序,然后C&P以下代码到Module1.vb中
Imports Microsoft.Office.Interop.Excel '在项目属性的引用中添加此引用,注意选择较高的版本。如果你一个都没有请安装Office正式版
Imports System.Text
Imports System.IO
Module Module1
Sub Main()
Dim app = New Application
Dim wb = app.Workbooks.Open("d:\1.xls") '要处理的文件在这里,请自行改名
Dim sh As Worksheet = wb.Sheets(1) '必须放在第一张工作表里
Dim table = New List(Of List(Of String)) 'excel的每个单元格的文本放在这张表里
For Each row As Range In sh.Rows
Dim firstCell As Range = row.Cells(1)
If firstCell.Text = String.Empty Then '从第一行一直处理到空行为止,第一行没有标题,直接放记录
Exit For
End If
Dim lsRow = New List(Of String)
For index As Integer = 1 To 4
Dim cell As Range = row.Cells(index)
lsRow.Add(cell.Text)
Next
table.Add(lsRow)
Next
Dim sb = New StringBuilder '此sb非彼sb,此sb乃StringBuilder
For Each row In table

Dim workNo = String.Format("{0:D4}", Integer.Parse(row(0)))
Dim eventDate = Date.Parse(row(1)).ToString("yyyy/MM/dd")
Dim eventTimeStart = Date.Parse(row(2).Substring(0, 8)).ToString("hh:mm:ss")
Dim eventTimeEnd = Date.Parse(row(3).Substring(0, 8)).ToString("hh:mm:ss")
If Not _isPass(row(2)) Then '一切听LZ的。。。
sb.AppendLine(workNo + ",0," + eventDate + "," + eventTimeStart)
End If
If Not _isPass(row(3)) Then '为了一切LZ。。。
sb.AppendLine(workNo + ",1," + eventDate + "," + eventTimeEnd)
End If
Next
File.WriteAllText("d:\1.txt", sb.ToString) '绕了半天终于出来了,放在这里,自己改名
wb.Close()
app.Quit() '如果你有300G的内存请无视他,不然还是加上吧
End Sub
Private Function _isPass(ByVal context As String) As Boolean
Return context.Contains("旷工") OrElse context.Contains("休息") OrElse context.Contains("未刷卡")
End Function
End Module
第2个回答  2009-11-13
对应读取excel文件中的信息,我只做过用oledb方式当它是数据库来读取,
string connstr = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath(serverpath) + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";//连接excel 文件的字符串

System.Data.OleDb.OleDbConnection myole = null;
myole = new System.Data.OleDb.OleDbConnection(connstr);
myole.Open();
System.Data.OleDb.OleDbCommand mycommand =new System.Data.OleDb.OleDbCommand ("select * from [Sheet1$]", myole);
/// 其中的[Sheet1$] 里的Sheet1是excel表名称,注意其格式是必须的。
System.Data.OleDb.OleDbDataReader dr = mycommand.ExecuteReader();
while(dr!=null && dr.Read())
{

//然后这里没一行一行的读,能够把每个单元格的数据读出来,再重新构造一遍又能有什么问题呢?
}