我正在尝试从excel / csv文件中删除所有非ascii字符。在线阅读和搜索后,我发现了一个帖子,它给了我代码xlWorksheet.UsedRange.Replace("[^\\u0000-\\u007F]"
以删除字符,但每次但字符仍然存在于文件中。
我还得到一个说明
的对话框我们找不到任何要替换的东西。单击选项以获取更多方法 搜索。
仅供参考:您尝试替换的数据可能是受保护的 片。 Excel无法替换受保护工作表中的数据。
不确定如何继续进行。我一直在寻找和在线阅读,但到目前为止没有找到任何有用的东西。
感谢您的帮助。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\username\Desktop\Error Records.csv");
Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
int lastUsedRow = xlWorksheet.Cells.Find("*", System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlPrevious,
false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Row;
int lastUsedColumn = xlWorksheet.Cells.Find("*", System.Reflection.Missing.Value,
System.Reflection.Missing.Value, System.Reflection.Missing.Value,
Excel.XlSearchOrder.xlByColumns, Excel.XlSearchDirection.xlPrevious,
false, System.Reflection.Missing.Value, System.Reflection.Missing.Value).Column;
// int lastColumnCount = lastUsedColumn;
//;
// for (int i = 1; i <= lastUsedColumn; i++)
// {
// for (int j = 1; j <= lastUsedRow; j++)
// {
// xlWorksheet.Cells[j, (lastColumnCount+1)] = "Testing data 134";
// }
// }
xlWorksheet.Cells[1, (lastUsedColumn + 1)] = "Title";
xlWorksheet.UsedRange.Replace("[^\\u0000-\\u007F]", string.Empty);
xlWorkbook.Save();
//cleanup
GC.Collect();
GC.WaitForPendingFinalizers();
//rule of thumb for releasing com objects:
// never use two dots, all COM objects must be referenced and released individually
// ex: [somthing].[something].[something] is bad
//release com objects to fully kill excel process from running in the background
Marshal.ReleaseComObject(xlRange);
Marshal.ReleaseComObject(xlWorksheet);
//close and release
xlWorkbook.SaveAs("C:\\Users\\username\\Desktop\\Errors_four.csv".Trim(), Excel.XlFileFormat.xlCSV);
xlWorkbook.Close();
Marshal.ReleaseComObject(xlWorkbook);
//quit and release
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
}
}
}
答案 0 :(得分:0)
每个范围内的foreach单元格,您可以使用以下函数将当前单元格字符串值替换为清理后的ascii。我不知道excel互操作库本机的任何ascii转换函数。我很好奇,你有什么例子可以提供你试图转换的内容吗?
请记住,还有FUNCTIONS,然后excel表中有VALUES。您的问题中不清楚您正在尝试使用哪种方法。你提到CSV让我觉得这些纯粹是VALUES操作。
public string ReturnCleanASCII(string s)
{
StringBuilder sb = new StringBuilder(s.Length);
foreach(char c in s.ToCharArray())
{
if((int)c > 127) // you probably don't want 127 either
continue;
if((int)c < 32) // I bet you don't want control characters
continue;
if(c == ',')
continue;
if(c == '"')
continue;
sb.Append(c);
}
return sb.ToString();
}
以下是一个示例用法。请记住,您需要弄清楚如何自己索引单元格,此示例仅适用于单元格1,1。另外,有两个有用的提示:单元格是1的索引,如果你调用Value2而不是Value,它可能会更快。
// get the value from a cell
string dirty = excelSheet.Cells[1, 1].Value.ToString(); // Value2 may be faster!
// convert to clean ascii
string clean = ReturnCleanASCII(dirty);
// set the cell value
excelSheet.Cells[1, 1].Value = clean;