Eu finalmente consertei o problema sozinho. Aqui está a resposta para fins de documentação:
Causa:
Algumas células continham quebras de linha. Na exportação para CSV, as quebras de linha foram convertidas em novas linhas, que não foram restauradas quando o arquivo foi reimportado no Excel, resultando em um número muito maior de linhas do que no original.
Solução:
Escreva um pequeno aplicativo que força cada linha a conter exatamente o mesmo número de caracteres TAB que o arquivo original. Se a linha não contiver o número esperado de TABs, adicione a próxima linha a ela até que o número adequado de TABs seja atingido. Insira um espaço reservado para marcar os locais onde as quebras de linha internas foram. Após o processamento, abra no Excel, verifique o número de linhas, localize e substitua o espaço reservado por uma quebra de linha (Alt + 010).
Aqui está o código C #: ele usa dois controles richtextbox:
public void restoreLines{
int nbTabs = 0;
int nbPrevTabs = 0;
int totalTabs = 0;
int lineNb = 0;
string content = "";
string sSource = rtbSrc.Text;
string[] lines = Regex.Split(sSource, "µ");
foreach (string line in lines)
{
lineNb++;
nbTabs = line.Length - line.Replace("\t", "").Length;
totalTabs = nbPrevTabs + nbTabs;
if (totalTabs == 15)
{
content += line.TrimEnd() + "##µ##";
nbTabs = 0;
nbPrevTabs = 0;
totalTabs = 0;
}
else if (totalTabs > 15)
{
MessageBox.Show("Line #" + lineNb + " contains " + totalTabs + " tabs");
break;
}
else
{
content += line.TrimEnd() + "##InnerCRLF##";
nbPrevTabs += nbTabs;
nbTabs = 0;
}
}
rtbRTF.Text = content;
}
Esta é obviamente uma solução rápida e suja, mas faz o trabalho e pode ser adaptada de maneira relativamente fácil para lidar com outros arquivos que sofrem do mesmo problema.