Silverlight 3文件对话框

| 好的-我有一个WCF服务,它可以从某个位置读取一个excel文件,并将数据剥离为一个对象。我需要的是允许程序用户将excel工作表上传到我的服务使用的文件位置的功能。 Alternitivley我可以将Uploaded excel表直接传递给服务。 有人能帮忙吗。我的服务代码是:
    public List<ImportFile> ImportExcelData(string FileName)
    {
        //string dataSource = Location + FileName;
        string dataSource = Location;
        string conStr = \"Provider=Microsoft.Jet.OLEDB.4.0;\" + \"Data Source=\" + dataSource.ToString() + \";Extended Properties=Excel 8.0;\";
        var con = new OleDbConnection(conStr);
        con.Open();

        var data = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        var sheetName = data.Rows[0][\"TABLE_NAME\"].ToString();

        OleDbCommand cmd = new OleDbCommand(\"SELECT * FROM [\" + sheetName + \"] WHERE Status = \'4\'\", con);
        OleDbDataAdapter oleda = new OleDbDataAdapter();
        oleda.SelectCommand = cmd;

        DataSet ds = new DataSet();
        oleda.Fill(ds, \"Employees\");
        DataTable dt = ds.Tables[0];

        var _impFiles = new List<ImportFile>();
        foreach (DataRow row in dt.Rows)
        {
            var _import = new ImportFile();

            _import.PurchaseOrder = row[4].ToString();

            try
            {
                var ord = row[8].ToString();
                DateTime dati = Convert.ToDateTime(ord);
                _import.ShipDate = dati;
            }
            catch (Exception)
            {
                _import.ShipDate = null;
            }


            ImportFile additionalData = new ImportFile();
            additionalData = GetAdditionalData(_import.PurchaseOrder);


            _import.NavOrderNo = additionalData.NavOrderNo;
            _import.IsInstall = additionalData.IsInstall;
            _import.SalesOrderId = additionalData.SalesOrderId;
            _import.ActivityID =  additionalData.ActivityID;
            _import.Subject =  additionalData.Subject ;

            _import.IsMatched = (_import.ShipDate != null & _import.NavOrderNo != \"\" & _import.NavOrderNo != null & _import.ShipDate > DateTime.Parse(\"01/01/1999\") ? true : false);

            _import.UpdatedShipToField = false;
            _import.UpdatedShipToFieldFailed = false;
            _import.CreateNote = false;
            _import.CreateNoteFailed = false;
            _import.CompleteTask = false;
            _import.CompleteTaskFailed = false;
            _import.FullyCompleted = 0;
            _import.NotCompleted = false;
            _impFiles.Add(_import);

        }


        oleda.Dispose();
        con.Close();
        //File.Delete(dataSource);

        return _impFiles;

        } 
    
已邀请:
您将需要修改服务以接受ѭ1而不是文件名,然后可以保存到文件中(或直接从ѭ1解析它,尽管我不知道该怎么做)。 然后,在您的Silverlight应用中,您可以执行以下操作:
private void Button_Click(object sender, RoutedEventArgs ev)
{
    var dialog = new OpenFileDialog();
    dialog.Filter = \"Excel Files (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|All Files (*.*)|*.*\";
    if (dialog.ShowDialog() == true)
    {
        var fileStream = dialog.File.OpenRead();
        var proxy = new WcfService();
        proxy.ImportExcelDataCompleted += (s, e) =>
        {
             MessageBox.Show(\"Import Data is at e.Result\");
             // don\'t forget to close the stream
             fileStream.Close();
        };
        proxy.ImportExcelDataAsync(fileStream);
    }
}
您也可以让WCF服务接受
byte[]
并执行类似的操作。
private void Button_Click(object sender, RoutedEventArgs ev)
{
    var dialog = new OpenFileDialog();
    dialog.Filter = \"Excel Files (*.xls;*.xlsx;*.xlsm)|*.xls;*.xlsx;*.xlsm|All Files (*.*)|*.*\";
    if (dialog.ShowDialog() == true)
    {
        var length = dialog.File.Length;
        var fileContents = new byte[length];
        using (var fileStream = dialog.File.OpenRead())
        {
            if (length > Int32.MaxValue)
            {
                throw new Exception(\"Are you sure you want to load > 2GB into memory.  There may be better options\");
            }
            fileStream.Read(fileContents, 0, (int)length);
        }
        var proxy = new WcfService();
        proxy.ImportExcelDataCompleted += (s, e) =>
                                                {
                                                    MessageBox.Show(\"Import Data is at e.Result\");
                                                    // no need to close any streams this way
                                                };
        proxy.ImportExcelDataAsync(fileContents);
    }
}
更新资料 您的服务可能如下所示:
public List<ImportFile> ImportExcelData(Stream uploadedFile)
{
    var tempFile = HttpContext.Current.Server.MapPath(\"~/uploadedFiles/\" + Path.GetRandomFileName());
    try
    {
        using (var tempStream = File.OpenWrite(tempFile))
        {
            uploadedFile.CopyTo(tempStream);
        }

        //string dataSource = Location + FileName;
        string dataSource = tempFile;
        string conStr = \"Provider=Microsoft.Jet.OLEDB.4.0;\" + \"Data Source=\" + dataSource.ToString() +
                        \";Extended Properties=Excel 8.0;\";
        var con = new OleDbConnection(conStr);
        con.Open();
    }
    finally
    {
        if (File.Exists(tempFile))
            File.Delete(tempFile);
    }
}
    
感谢本德威,太好了。必须稍作修改- 我的服务:
        var tempFile = @\"c:\\temp\\\" + Path.GetRandomFileName();

        try  
        {        

            int length = 256;
            int bytesRead = 0;
            Byte[] buffer = new Byte[length];

            // write the required bytes
            using (FileStream fs = new FileStream(tempFile, FileMode.Create))
            {
                do
                {
                    bytesRead = uploadedFile.Read(buffer, 0, length);
                    fs.Write(buffer, 0, bytesRead);
                }
                while (bytesRead == length);
            }

            uploadedFile.Dispose();             



            string conStr = \"Provider=Microsoft.Jet.OLEDB.4.0;\" + \"Data Source=\" + dataSource.ToString() + \";Extended Properties=Excel 8.0;\";
            var con = new OleDbConnection(conStr);
再次感谢你的帮助     

要回复问题请先登录注册