首页 新闻 会员 周边

求C#高手,搞过C# winform操作EXCEL的

0
悬赏园豆:30 [已解决问题] 解决于 2012-03-26 16:23

如图,Excel中显示的是日期格式

 

下面是我的代码:

 

DataSet ds = GetWorkbook(Application.StartupPath + @"\App_Data\Book1.xls");

public static DataSet GetWorkbook(string filename)
{
DataSet ds = new DataSet();
Excel.Application app = new Excel.Application(); //初始化Excel对象
app.Visible = false;
app.DisplayAlerts = false;
object missing = System.Reflection.Missing.Value;
Excel.Workbook wb;// = app.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
try
{
wb = app.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
throw;
}
foreach (Excel.Worksheet ws in wb.Sheets)
{
ds.Tables.Add(GetWorksheet(ws));
}
app.Workbooks.Close();
app.Quit();
return ds;
}



public static DataTable GetWorksheet(Excel.Worksheet ws)
{
DataTable dt = new DataTable();
dt.TableName = ws.Name;

int row = ws.UsedRange.Rows.Count + 1;
int col = ws.UsedRange.Columns.Count + 1;

for (int c = 1; c < col; c++)
{
dt.Columns.Add("F" + c);
}

for (int r = 1; r < row; r++)
{
DataRow newRow = dt.NewRow();
for (int c = 1; c < col; c++)
{
newRow[c - 1] = ((Excel.Range)ws.Cells[r, c]).Value2; //问题是不是出在这里,请问怎么解决呢
}
dt.Rows.Add(newRow);
}

return dt;
}


 我们要求这样操作Excel,不能用SQL的方式,这个主要是能把每个Sheet都要读出来,就像图2的那个下拉框里面的Sheet就是读取出来的

逊王之王的主页 逊王之王 | 初学一级 | 园豆:9
提问于:2012-03-26 10:58
< >
分享
最佳答案
0

直接读 value  是什么样的? 
我觉得 是这样 你的这个datatable 默认的是一个空表。
然后按照文件读取,你先看一下 这个DataTable 的这一列的类型是什么样的?
如果是String 那么我觉得就是得到的值直接做了 ToString 这样的操作。
再就是你试试 value 或者value2 这个得到的值是些什么样的值? 
也许你就能得到答案了

收获园豆:30
二十二号同学 | 小虾三级 |园豆:790 | 2012-03-26 15:13

C#没有value,只有value2,不过你提醒了我去找其它属性,我找到了.text属性,解决了这个问题,不过又遇到其它问题,比如显示时间内容太长的单元格的值显示到DataGridView中会全部是#####

逊王之王 | 园豆:9 (初学一级) | 2012-03-26 16:23

@逊王之王: 我找了下  在这边我写过 
workSheet.Range(String.Format("R_{0}_C_{1}", i, j)).Value 
是有这个提示的
Imports Microsoft.Office.Interop 
你看下 你能引用这个包么? 如果可以的话 应该是可以有这个属性的 。 
具体的这边也弄不出来了~  :( 

二十二号同学 | 园豆:790 (小虾三级) | 2012-03-26 17:37

@天生俪姿: 

//设置列宽根据内容自动调整大小 worksheet.Columns.EntireColumn.AutoFit();

这样就搞定了

逊王之王 | 园豆:9 (初学一级) | 2012-04-05 10:12

@逊王之王: :0  不错 能出来就好 ,不过我现在也搞不太懂了~  那样写是有提示的 直接就取到值了 。

二十二号同学 | 园豆:790 (小虾三级) | 2012-04-05 11:22
其他回答(2)
0

這個 好像 沒有辦法,excell是帶智能的。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 11:05

Excel带智能的是什么意思呢

支持(0) 反对(0) 逊王之王 | 园豆:9 (初学一级) | 2012-03-26 11:23

@逊王之王: 就是 如果你輸入的是 日期類型,不管你做什嗎處理,讀出來就是日期。還 有,對于這個操作,一定要保證,excell是用新的模板生成的,最好不要用拷貝的。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 11:28

@無限遐想: 我自己新建了一个Excel,并且直接输入时间,也不行,这个要做怎么处理,求指教

支持(0) 反对(0) 逊王之王 | 园豆:9 (初学一级) | 2012-03-26 14:46

@逊王之王: 你干嗎 要這麼讀。你直接用 oledb ,直接加載到dataset哦

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 14:50

@逊王之王: 用 select * from +你的sheet 。直接就讀取 進dataset中了。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 14:51

@無限遐想: 我都想直接用SQL的方式做哦,但老大就是让我这样做出来

支持(0) 反对(0) 逊王之王 | 园豆:9 (初学一级) | 2012-03-26 15:33

@逊王之王: ((Excel.Range)ws.Cells[r, c]).Value2  爲什麽要轉換呢?直接 賦給數值不行嗎?

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 15:44

@逊王之王: 除非你根據,實際類型,進行轉換哦

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-26 15:47
0
((Excel.Range)ws.Cells[r, c]).NumberFormatLocal = "yyyy/MM/dd" ;
试试加上面的。
LCM | 园豆:6876 (大侠五级) | 2012-03-26 11:10

因为我是把整个Excel的内容通过循环读取,得到的一个DataSet,这样读取的值不仅包含日期格式的内容,还有其它格式的内容。所以不能用这个方法。

支持(0) 反对(0) 逊王之王 | 园豆:9 (初学一级) | 2012-03-26 11:22

求大侠帮帮忙

支持(0) 反对(0) 逊王之王 | 园豆:9 (初学一级) | 2012-03-26 11:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册