Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# dbf中只有一半的数据被转换为xls_C#_Excel - Fatal编程技术网

C# dbf中只有一半的数据被转换为xls

C# dbf中只有一半的数据被转换为xls,c#,excel,C#,Excel,您好,我正在尝试将dbf转换为xls,但问题是只有一半的数据被转换。有人能帮我找到这里的问题吗 下面是我将要转换的dbf的示例图片。 这是转换后的文件,只有2个数据 更新 这是所要求的另一个样品 我转换这个dbf文件。 这就是结果 这是密码 static Missing mv = Missing.Value; private void button1_Click(object sender, EventArgs e) { Dia

您好,我正在尝试将dbf转换为xls,但问题是只有一半的数据被转换。有人能帮我找到这里的问题吗

下面是我将要转换的dbf的示例图片。

这是转换后的文件,只有2个数据

更新 这是所要求的另一个样品

我转换这个dbf文件。

这就是结果

这是密码

  static Missing mv = Missing.Value;
        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult result = openFileDialog1.ShowDialog(); // Show the dialog.
            if (result == DialogResult.OK) // Test result.
            {
                textBox1.Text = openFileDialog1.FileName;



            }
        }

 private void button2_Click(object sender, EventArgs e)
        {
            string constr = "Provider=VFPOLEDB.1;Data Source=" + Directory.GetParent(textBox1.Text).FullName;
            string ExcelFileName = AppDomain.CurrentDomain.BaseDirectory + System.IO.Path.GetFileNameWithoutExtension(textBox1.Text) + ".xls";
            using (OleDbConnection con = new OleDbConnection(constr))
            {
                var sql = "select * from " + Path.GetFileName(textBox1.Text) + ";";
                OleDbCommand cmd = new OleDbCommand(sql, con);
                DataTable dt = new DataTable();
                try
                {
                    con.Open();
                }
                catch (Exception ex)
                {

                    MessageBox.Show("Error connecting database: " + ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                if (con.State == ConnectionState.Open)
                {
                    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                    MessageBox.Show("Reading database...  ", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    da.Fill(dt);
                    MessageBox.Show("Completed.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                if (con.State == ConnectionState.Open)
                {
                    try
                    {
                        con.Close();
                    }
                    catch { }
                }

                if (dt != null && dt.Rows.Count > 0)
                {
                    GenerateExcel(dt, ExcelFileName);
                }
            }

        }

static void GenerateExcel(DataTable sourceDataTable, string ExcelFileName)
        {
            MessageBox.Show("Generating Excel File...", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);


            Excel.Application excelApp = new Excel.Application();
            Excel.Workbook wkb = excelApp.Workbooks.Add(mv);
            Excel.Worksheet wks = wkb.Sheets[1];

            for (int i = 0; i < sourceDataTable.Columns.Count; ++i)
            {
                ((Excel.Range)wks.Cells[1, i + 1]).Value = sourceDataTable.Columns[i].ColumnName;
            }
            Excel.Range header = wks.get_Range((object)wks.Cells[1, 1], (object)wks.Cells[1, sourceDataTable.Columns.Count]);
            header.EntireColumn.NumberFormat = "@";

            object[,] sourceDataTableObjectArray = new object[sourceDataTable.Rows.Count, sourceDataTable.Columns.Count];
            for (int row = 0; row < sourceDataTable.Rows.Count; ++row)
            {
                for (int col = 0; col < sourceDataTable.Columns.Count; ++col)
                {
                    sourceDataTableObjectArray[row, col] = sourceDataTable.Rows[row][col].ToString();
                }
            }
            ((Excel.Range)wks.get_Range((object)wks.Cells[2, 1], (object)wks.Cells[sourceDataTable.Rows.Count, sourceDataTable.Columns.Count])).Value2 = sourceDataTableObjectArray;
            header.EntireColumn.AutoFit();
            header.Font.Bold = true;
            wks.Application.ActiveWindow.SplitRow = 1;
            wks.Application.ActiveWindow.FreezePanes = true;
            wks.SaveAs(ExcelFileName, Excel.XlFileFormat.xlExcel8, mv, mv, mv, mv, mv, mv, mv, mv);
            wks = null;
            wkb = null;
            excelApp.Quit();
            MessageBox.Show("Completed.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
static Missing mv=Missing.Value;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
DialogResult=openFileDialog1.ShowDialog();//显示对话框。
if(result==DialogResult.OK)//测试结果。
{
textBox1.Text=openFileDialog1.FileName;
}
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
string constr=“Provider=VFPOLEDB.1;数据源=“+Directory.GetParent(textBox1.Text).FullName;
字符串ExcelFileName=AppDomain.CurrentDomain.BaseDirectory+System.IO.Path.GetFileNameWithoutExtension(textBox1.Text)+“.xls”;
使用(OLEDB连接con=新OLEDB连接(cont))
{
var sql=“select*from”+Path.GetFileName(textBox1.Text)+“;”;
OleDbCommand cmd=新的OleDbCommand(sql,con);
DataTable dt=新的DataTable();
尝试
{
con.Open();
}
捕获(例外情况除外)
{
MessageBox.Show(“连接数据库时出错:+ex.Message,“Message”,MessageBoxButtons.OK,MessageBoxIcon.叹号);
返回;
}
if(con.State==ConnectionState.Open)
{
OleDbDataAdapter da=新的OleDbDataAdapter(cmd);
MessageBox.Show(“读取数据库…”,“消息”,MessageBoxButtons.OK,MessageBoxIcon.Information);
da.填充(dt);
MessageBox.Show(“已完成”,“消息”,MessageBoxButtons.OK,MessageBoxIcon.Information);
}
if(con.State==ConnectionState.Open)
{
尝试
{
con.Close();
}
捕获{}
}
如果(dt!=null&&dt.Rows.Count>0)
{
GenerateExcel(dt,ExcelFileName);
}
}
}
静态void GenerateExcel(DataTable sourceDataTable,string ExcelFileName)
{
MessageBox.Show(“生成Excel文件…”,“消息”,MessageBoxButtons.OK,MessageBoxIcon.Information);
Excel.Application excelApp=新的Excel.Application();
Excel.Workbook wkb=excelApp.Workbooks.Add(mv);
Excel.Worksheet wks=wkb.Sheets[1];
对于(int i=0;i
解释最后一行不断被删除原因的一个问题:

((Excel.Range)wks.get_Range((object)wks.Cells[2, 1], (object)wks.Cells[sourceDataTable.Rows.Count, sourceDataTable.Columns.Count])).Value2 = sourceDataTableObjectArray;
应改为

((Excel.Range)wks.get_Range((object)wks.Cells[2, 1], (object)wks.Cells[sourceDataTable.Rows.Count + 1, sourceDataTable.Columns.Count])).Value2 = sourceDataTableObjectArray;
说明:Excel范围不够大(1太小),无法接受完整的sourceDataTable

至于其他问题(见示例1)-问题在于数据库。“缺失”数据不包括在数据库查询返回中,因为这些行在.dbf文件中标记为“已删除”。这一来源:

让我相信你可以通过改变来解决你的问题

var sql = "select * from " + Path.GetFileName(textBox1.Text) + ";";


我真的不是dbf数据库和sql查询方面的专家,如果这不起作用,您应该将其作为一个新问题发布。

代码看起来不错。您可以添加一些日志记录,以便知道在什么时候“丢失”这些行。示例:使用System.Diagnostics;WriteLine(“dt此时有行”)@乌利·施密德不知道该怎么办:(如果我查看顶部屏幕截图中的数据,很明显哪些数据没有通过。你确定前7行中的数据值得关注吗?可能输出中不需要的只是表头数据?@Nick.McDermaid我测试转换许多dbf sir。但结果有些数据缺少最后的数据,有些数据只有一半。:3@nethken更多的例子可能会帮助我们找到一种模式-您能再给我们看一两个有问题的文件吗?如果您正在记录,具体输出是什么?我转换一个有27行的dbf文件。然后输出是“dt在点1处有行。sourceDataTable在点2处有行,这缩小了问题的范围。在excel文件中
string tableName = Path.GetFileName(textBox1.Text)
var sql = "select * from Deleted(" + tableName + ") UNION select * from " + tableName + ";";