C#을 사용하여 CSV 데이터를 Windows 클립 보드에 붙여 넣는 방법
문제
내가 성취하려는 것
- 내 앱은 몇 가지 표 형 데이터를 생성합니다
- 사용자가 Excel을 시작하고 "붙여 넣기"를 클릭하여 데이터를 Excel에 셀로 배치 할 수 있기를 원합니다.
- Windows는 API와 함께 사용되는 "CommaseParatedValue"라는 형식을 수락하므로 가능해 보입니다.
- 클립 보드 작업에 RAW 텍스트를 넣지만이 형식을 사용하려고하는 것은 아닙니다.
- 참고 : 클립 보드에서 CSV 데이터를 올바르게 검색 할 수 있습니다. 내 문제는 CSV 데이터를 클립 보드에 붙여 넣는 것입니다.
내가 시도한 것은 작동하지 않습니다
clipboard.settext ()
System.Windows.Forms.Clipboard.SetText(
"1,2,3,4\n5,6,7,8",
System.Windows.Forms.TextDataFormat.CommaSeparatedValue
);
Clipboard.SetData ()
System.Windows.Forms.Clipboard.SetData(
System.Windows.Forms.DataFormats.CommaSeparatedValue,
"1,2,3,4\n5,6,7,8",
);
두 경우 모두 클립 보드에 무언가가 배치되지만 Excel에 붙여 넣으면 Garbarge 텍스트의 한 셀로 표시됩니다.
업데이트 1 : settext ()를 사용한 해결 방법
Bfree의 답변에서 알 수 있듯이 setText ~와 함께 TextDataFormat 해결 방법으로 사용됩니다
System.Windows.Forms.Clipboard.SetText(
"1\t2\t3\t4\n5\t6\t7\t8",
System.Windows.Forms.TextDataFormat.Text
);
나는 이것을 시도하고 이제 엑셀과 단어로 붙여 넣는 것이 올바르게 작동한다는 것을 확인했습니다. 각각의 경우에는 평범한 텍스트 대신 셀이있는 테이블로 페이스트합니다.
CommaseParatedValue가 왜 궁금합니다 ~ 아니다 일하고 있는.
해결책
.NET 프레임 워크가 있습니다 DataFormats.CommaSeparatedValue
클립 보드에서 유니 코드 텍스트. 그러나 언급했듯이 http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q, Excel은 CSV 데이터가 UTF-8 메모리 스트림 일 것으로 예상합니다 (.NET 또는 Excel이 비 호환성에 대한 오류인지 여부를 말하기는 어렵습니다).
제가 응용 프로그램에서 제시 한 솔루션은 클립 보드에 두 가지 버전의 테이블 데이터를 동시에 탭으로 연결된 텍스트와 CSV 메모리 스트림으로 배치하는 것입니다. 이를 통해 대상 응용 프로그램은 선호하는 형식으로 데이터를 얻을 수 있습니다. 메모장과 Excel은 탭으로 된 텍스트를 선호하지만 Excel은 테스트 목적으로 페이스트 스페셜 ... 명령을 통해 CSV 데이터를 가져 오도록 강요 할 수 있습니다.
다음은 몇 가지 예제 코드입니다 (WPF 네임 스페이스의 Winforms-Equivalents는 여기에서 사용됩니다).
// Generate both tab-delimited and CSV strings.
string tabbedText = //...
string csvText = //...
// Create the container object that will hold both versions of the data.
var dataObject = new System.Windows.DataObject();
// Add tab-delimited text to the container object as is.
dataObject.SetText(tabbedText);
// Convert the CSV text to a UTF-8 byte stream before adding it to the container object.
var bytes = System.Text.Encoding.UTF8.GetBytes(csvText);
var stream = new System.IO.MemoryStream(bytes);
dataObject.SetData(System.Windows.DataFormats.CommaSeparatedValue, stream);
// Copy the container object to the clipboard.
System.Windows.Clipboard.SetDataObject(dataObject, true);
다른 팁
쉼표 대신 탭을 사용하십시오. 즉:
Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);
방금 이것을 직접 테스트했고 그것은 나를 위해 일했습니다.
나는 t (bfree의 답변 참조)를 열 분리기로, n을 행 분리기로 사용하여 Excel로 붙여 넣은 성공을 거두었습니다.