我可以逐行阅读Excel电子表格,然后通过CSV
将其转换为C#
。
以下是基础知识:
static void convertExcelToCSVThenJS(string sourceFile, string worksheetName, string targetFile, string varName, StreamWriter jsWrtr )
{
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + sourceFile + ";Extended Properties=\"Excel 12.0; HDR=NO\"";
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sourceFile + ";Extended Properties=\" Excel.0;HDR=Yes;IMEX=1\"";
OleDbConnection conn = null;
StreamWriter wrtr = null;
OleDbCommand cmd = null;
OleDbDataAdapter da = null;
try
{
conn = new OleDbConnection(strConn);
conn.Open();
cmd = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", conn);
cmd.CommandType = CommandType.Text;
wrtr = new StreamWriter(targetFile);
da = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
//gets data from cells
int idCount=0;
for (int x = 0; x < dt.Rows.Count; x++)
{
string rowString = "";
for (int y = 0; y < dt.Columns.Count; y++)
{
if (dt.Rows[0][y].ToString().ToUpper().Equals("ID")) { idCount = y; };
var thisCell = dt.Rows[x][y];
var cellContain = dt.Rows[x][y].ToString().Replace("\"", "");
rowString += "\"" + cellContain + "\",";
rowString = rowString.Replace("\"", "");
}
if (dt.Rows[x][idCount].ToString() != "")
{
if (x != 1)
{
wrtr.WriteLine(rowString);
}
}
}
wrtr.Close();
//and so on
这在大多数工作表中都很有用。但特别是在一个特定的单元格中,它不会读取特定的单元格,只会将其返回为空。
我已经覆盖了这个单元格,即在这个单元格上复制并粘贴了一个空白单元格,然后重新编写了字符串,它工作正常,但我无法使用此作为答案,因为最终我会将此工具传递给同事会将电子表格扔到可能再次发生此问题的地方。
基本上我在这一行之后设置了一个调试点:
var thisCell = dt.Rows[x][y];
逐步完成for循环的每一步,经过dt.Columns
。我到达了我遇到问题的单元格,将鼠标悬停在此变量上并且为空,在Excel中它是基本字符串,没有公式等。
如果我将此单元格复制到别处并尝试读取它,则会出现相同的错误,但对于新单元格。
我想也许数据验证可能是问题所在,但我目前对Excel并不擅长,所以我不知道要检查什么。
有没有人遇到过这个?或者我在某个地方出错了?